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]*
,因为我不知道您在问题描述中是否将其作为元变量
如果您有GNUsed
,则可以通过使用\?
和\+
稍微改进:
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