删除输入列表的可变部分



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

(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,我相信这是要走的路,但我几乎没有经验。

也许:

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

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

如果你有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}[):]? *$//'

这不是很理想...但有效:

$ 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加上最终的尾随空格。

这是我想到的:

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

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

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

避免打开(而不关闭)

您可以使用 awk 单行:

$ 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 是字段数,即列),是不包含您打印它的 BLA i列号。在每行之后,打印"n"

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新