我想 grepWORK=
后面的字符串,并忽略该字符串之后是否有偏执。
文本如下所示:
//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
- else,获取该行并删除所有包括WORK=
,然后将逗号以外的任何零个或多个字符捕获到组中 1,然后删除该行的其余部分;p
打印结果。
请参阅sed
演示:
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
您能否尝试以下awk
,使用GNUawk
中显示的示例编写和测试。
awk '
match($0,/WORK=[^,]*/){
val=substr($0,RSTART+5,RLENGTH-5)
if(val!~/([a-zA-Z]+)/){ print val }
}
' Input_file
说明:为上述添加详细说明。
awk ' ##Starting awk program from here.
match($0,/WORK=[^,]*/){ ##Using match function to match WORK= till comma comes.
val=substr($0,RSTART+5,RLENGTH-5) ##Creating val with sub string of match regex here.
if(val!~/([a-zA-Z]+)/){ print val } ##checking if val does not has ( alphabets ) then print val here.
}
' Input_file ##Mentioning Input_file name here.
这可能对你有用(GNU sed):
sed -n '/.*WORK=([^,]+).*/{s//1/;/(.*)/!p}' file
提取WORK=
后面的字符串,如果该字符串不包含(...)
则打印它。
如果只有零次或一次出现WORK=
并且排除仅取决于该字符串中出现的(...)
,而不是其他后续字段,则此方法将起作用。
对于具有相同参数规定的全局解决方案:
sed -n '/WORK=([^,]+)/{s//n1n/;s/[^n]*n//;/(.*).*n/!P;D}' file
注:注:这会在单独的行上打印每个这样的字符串,并排除空字符串。