2010-04-21 17 views
7

去除導致部分如何刪除部分字符串達到一定的角色?如何在bash

例如)如果我有字符串testFile.txt.1testFile.txt.12345如何刪除112345

編輯:我的意思是,除去和扔掉一個字符串中的第一部分,以某個字符,並保持它的結束。

+0

這個問題有點不清楚 - 請你澄清「刪除部分字符串到某個字符?」;這個例子可以用很多方式來解釋,說實話,其中的大部分都是爲了「在特定角色之後移除」而不是「到達」。 – DVK 2010-04-21 04:27:44

回答

11

只使用bash的設施

$ s=testFile.txt.1 
$ echo ${s%.*} 
testFile.txt 

$ s=testFile.txt.12345 
$ echo ${s%.*} 
testFile.txt 

刪除之前前導零

$ echo ${s#*.} 
txt.12345 

其他方法,您可以使用IFS

$ s=testFile.txt.12345 
$ IFS="." 
$ set -- $s 
$ echo $1 
testFile 
$ echo $2 
txt 
$ echo $3 
12345 
1

如果你只是想刪除從文件名的後綴知道,你可以使用basename

basename testFile.txt.1 .1 
basename testFile.txt.12345 .12345 
+0

有沒有一種優雅的方式可以在同一行中刪除該領先期? 我可以做到兩個,我只是好奇......非常感謝您的幫助! – 2010-04-21 04:17:32

+0

我不確定你在討論什麼領先階段 – 2010-04-21 04:32:57

1

你可以用sed做一個搜索和替換。 <<<運算符將在stdin中傳遞一個字符串。

$ sed 's/\.[0-9]*$//' <<< "testFile.txt.1" 
testFile.txt 
$ sed 's/\.[0-9]*$//' <<< "testFile.txt.12345" 
testFile.txt 
+0

請注意,如果你正在處理大量文件,如果它啓動一個新進程('sed'),將花費比「純粹的bash」解決方案明顯更長的時間每一個。 – drevicko 2013-06-19 03:04:28

0

問題分割你串起來有點不清楚 - 例如e提供的可能意味着您想刪除所有#,或者刪除最後一個「。」後面的部分,或者刪除第一個「1」後的部分,或者刪除字符13後的所有字符。請澄清。

如果你的意思是你想刪除的字符串(例如,「最多字符#13」)前N個字符,做echo testFile.txt.1 | cut -c14-。另一方面,要保留字符1-13,請執行以下操作:echo testFile.txt.1 | cut -c1-13

如果您的意思是要在首次出現特定字符(在您的示例中似乎爲「1」)之前刪除起始字符, ,做echo testFile.txt.1 | perl -e 's/^[^1]*//;'。要如果要刪除後,最後刪除一切一切之後的第一個「1」,做echo testFile.txt.1 | perl -e 's/1.*$//;'

如果你想刪除所有#分別,做echo testFile.txt.1 | perl -e 's/\d//g;'或不Perl中,echo testFile.txt.1 | tr -d "[0-9]"

「」做echo testFile.txt.1 | perl -e 's/\.[^.]+/./;'

+0

爲什麼倒票? – DVK 2010-04-21 04:39:53

0
# remove string prefix up to the first digit 
var='testFile.txt.12345' 
var='test1File.txt.12345' 
var='testFile.txt.1' 
var='testFile.txt' 

echo "${var#"${var%%[[:digit:]]*}"}"