我有一个输入列表,我想从中删除变量字符串的出现。说我的输入列表如下所示:
(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
,我认为这是要走的路,但我几乎没有经验。
答案 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"
希望这有帮助。