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

标签 regex linux unix sed

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

相关文章:

php - 如何使用 mod rewrite/htaccess 创建带有两个或多个参数的友好 URL?

MySQL - 查询返回值匹配正则表达式模式

linux - Unix : hyphen(-) getting replaced by <96>

javascript - 无法使用 json 交换所有键值对

linux - 如何从其他 grep 命令的输出行中获取子字符串

linux - 从 tty 与脚本执行时 Awk 命令的结果不同

javascript - 如何每隔 n 个字符或最近的前一个空格分割字符串

c# - 如何在进行正则表达式搜索时排除组合?

linux - 更改 xorg 审计级别

linux - 在 Linux 中快速查找文件名并指定目录的方法