删除输入列表的可变部分

时间:2014-02-21 13:53:40

标签: bash shell sed

我有一个输入列表,我想从中删除变量字符串的出现。说我的输入列表如下所示:

(BLA-123) some text
BLA-123 some text
BLA-123: some text
some text (BLA-123)
some text BLA-123

我希望我的输入列表看起来像:

some text
some text
some text
some text
some text

基本上,我需要删除BLA-[0-9]{1,4}(中可能包含的任何)的所有匹配项,或者从:开始,从开头和输入列表中任何一行的结尾。

我想过使用cut,但很难实现我的需求。然后我想到了sed,我认为这是要走的路,但我几乎没有经验。

5 个答案:

答案 0 :(得分:1)

这不是最优的......但是有效:

$ sed -e 's/(BLA-[0-9]*)[ ]*//g' -e 's/BLA-[0-9]*:[ ]*//g' -e 's/BLA-[0-9]*[ ]*//g' a
some text
some text
some text
some text 
some text 
  • s/(BLA-[0-9]*)[ ]*//g删除(BLA-XXXX)加上最终的尾随空格。
  • s/BLA-[0-9]*:[ ]*//g删除BLA-XXXX:加上最终的尾随空格。
  • s/BLA-[0-9]*[ ]*//g删除BLA-XXXX加上最终的尾随空格。

答案 1 :(得分:1)

以下是我提出的建议:

sed -E 's/[[:punct:]]?BLA-[[:digit:]]{1,4}[[:punct:]]?[[:space:]]*//'

在某些输出行的末尾有一个尾随空格,您可以通过将[[:space:]]*放在开头来消除。

答案 2 :(得分:1)

也许:

sed 's/ *[(]*[A-Z][A-Z]*-[0-9]\{1,4\}[):]* *//'

我已将BLA替换为任意大写字符串[A-Z][A-Z]*,因为我不知道您是否将其视为问题描述中的元变量。

如果你有GNU sed,可以使用\?\+稍微改善一下:

sed 's/ *[(]\?[A-Z]\+-[0-9]\{1,4\}[):]\? *//'

然而,这些转换:

some text BLA-123 more text

为:

some textmore text

这可能不是你想要的。如果你想让这样的一行保持不变,那么你可以加倍替换,修改第一个,使它只匹配开头,第二个匹配,最后匹配:

sed 's/^ *[(]\?[A-Z]\+-[0-9]\{1,4\}[):]\? *//;s/ *[(]\?[A-Z]\+-[0-9]\{1,4\}[):]\? *$//'

答案 3 :(得分:1)

sed 's/ *(BLA-[0-9]\{1,4\}) *//
s/ *BLA-[0-9]\{1,4\}:\{0,1\} *//' YourFile

避免打开(而不打开)

答案 4 :(得分:1)

你可以使用awk one-liner:

$ cat toto
(BLA-123) some text
BLA-123 some text
BLA-123: some text
some text (BLA-123)
some text BLA-123

$ awk '{for (i=0;i<=NF;i=i+1) if ($i!~/BLA/) printf $i" "}{printf "\n"}' toto
some text 
some text 
some text 
some text 
some text

哪个可以翻译

对于每一行(awk通过逐行解析工作),对于每个字段(NF是字段数,即列),列号i不包含您打印的BLA。在每一行之后,打印"\n"

希望这有帮助。