2012-02-08 57 views
15

我想刪除字符串末尾的任何ABC。使用sed或其他bash工具刪除字符串末尾的圖案

我已經想出了最好的是

echo ${String}| sed -e 's/["ABC"]*$//g' 

但是,它會刪除所有的A或B或C在字符串的結尾。

如果字符串是DAAAAABCBBBCCABCABC,如果我使用上面的表達式,它會返回,而不是「DAAAAABCBBBCC」

是否有這樣做的更好辦法「d」?謝謝。

回答

10

這應該工作:

echo "DAAAAABCBBBCCABCABC" | sed -e 's/\(ABC\)*$//g' 

結果:括號和*之間

DAAAAABCBBBCC 

環繞串適用於該確切爲了在他們裏面的所有字母。

4

你應該使用:

sed -E 's/(ABC)+$//' 

OR:

sed -r 's/(ABC)+$//' 

兩個將給輸出:

DAAAAABCBBBCC 
+0

值得一提的是這兩個參數使解釋的expresion作爲擴展正則表達式。我看到Mac(Darwin)使用的'-E'和其他linux發行版使用'-r'。 – LopSae 2012-12-10 21:37:40

+0

'-E'是與BSD sed兼容的無證選項。你幾乎可以肯定使用'-r'。 '-E'在sed的busybox版本上會失敗。 – Six 2015-04-10 02:29:06

16

Bash可以在內部做到這一點。以下在末端刪除任何「ABC」的字符串,並將其結果可以在變量賦值,命令或任何用於:

${String%ABC} 

參見http://tldp.org/LDP/abs/html/string-manipulation.html

+1

這隻會刪除最後一次出現的ABC。這種Shell參數擴展使用glob,所以不可能用它來表示「任意數量的ABC」。更多信息:http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion – LopSae 2012-12-10 21:39:54

+0

好點!謝謝 – mabraham 2013-01-30 00:10:39

+0

@LopSae帶有擴展的球體('shop -s extglob'),它可以工作:'$ {String %% +(ABC)}' – 2018-01-17 15:41:10