我想 grep WORK=
之后的字符串,并忽略该字符串后面是否有括号。
文本如下所示:
//INALL TYPE=GH,WORK=HU.ET.ET(IO)
//INA2 WORK=HU.TY.TY(OP),TYPE=KK
//OOPE2 TYPE=KO,WORK=TEXT.LO1.LO2,TEXT
//OOP2 TYPE=KO,WORK=TEST1.TEST2
//H1 WORK=OP.TEE.GHU,TYPE=IU
所以,理想的输出应该只打印:
TEXT.L01.L02
TEST1.TEST2
OP.TEE.GHU
到目前为止,我只能在 WORK=
之前进行匹配和剪切,但无法删除 WORK=
本身:
sed -E 's/(.*)(WORK=.*)/\2/'
我不知道如何继续。有人可以帮忙吗?
最佳答案
你可以使用
sed -n '/WORK=.*([^()]*)/!s/.*WORK=\([^,]*\).*/\1/p' file > newfile
详细信息:
-n
- 抑制默认行输出/WORK=.*([^()]*)/!
- 如果一行包含WORK=
后跟任何文本,然后是(...)
子字符串跳过它s/.*WORK=\([^,]*\).*/\1/p
- 否则,获取该行并删除所有直到(包括)WORK=
,然后将除逗号以外的任何零个或多个字符捕获到第 1 组中,然后删除该行的其余部分;p
打印结果。
参见the sed
demo :
s='//INALL TYPE=GH,WORK=HU.ET.ET(IO)
//INA2 WORK=HU.TY.TY(OP),TYPE=KK
//OOPE2 TYPE=KO,WORK=TEXT.LO1.LO2,TEXT
//OOP2 TYPE=KO,WORK=TEST1.TEST2
//H1 WORK=OP.TEE.GHU,TYPE=IU'
sed -n '/WORK=.*([^()]*)/!s/.*WORK=\([^,]*\).*/\1/p' <<< "$s"
输出:
TEXT.LO1.LO2
TEST1.TEST2
OP.TEE.GHU
关于regex - 如何使用sed匹配和剪切不同条件的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65484185/