Bash 删除输入列表的可变部分

Bash 删除输入列表的可变部分,bash,shell,sed,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},它们可能包含在(和)中,或者后面跟着一个:

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

(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 -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/ *[(]*[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
      
      致:

      这可能不是你想要的。如果希望该行保持不变,则可以将替换加倍,修改第一行,使其仅在开头匹配,修改第二行,使其在结尾匹配:

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

      避免打开
      而不关闭

      您可以使用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
      
      $cat toto
      (BLA-123)一些文本
      BLA-123一些文本
      BLA-123:一些文本
      一些文本(BLA-123)
      一些文本BLA-123
      
      $awk'{for(i=0;i最后一行不包含
      ()
      或a
      。如何处理此问题?我写道,它可能是封闭的,也不一定是封闭的。抱歉,但可能无法回答。您知道它需要模式替换。如果无法命名模式,则无法使用模式替换为什么?是否可以替换出现的模式仅当某个字符串存在时才使用它?我觉得它不正确。添加用于将行拆分为列的分隔符是什么?@AndreiHorak默认分隔符是空格或制表符。如果要更改它,请添加:awk-F:“{for(i=0;我已使用此变体。感谢您的详细回答和所有解释。
      sed 's/ *(BLA-[0-9]\{1,4\}) *//
      s/ *BLA-[0-9]\{1,4\}:\{0,1\} *//' YourFile
      
      $ 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