如何使用 sed 匹配和切割不同条件的字符串?



我想 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

注:注:这会在单独的行上打印每个这样的字符串,并排除空字符串。

最新更新