regex - 如何从 linux 中的文件的每一行中删除与模式匹配的重复单词

标签 regex linux bash sed awk

我有一个类似下面的文件

LINE 1:
type,rcpt,dlvSourceIp,timeLogged,header_Message-Id,bounceCat,dsnStatus,dsnDiag

LINE 2: d,olaj,asjdfuyjdv,2014-02-07
14-08560,<13.e0.IM.45.811MSOSI1.102O@maien.com>,suc,2.0.0
(success),smtp;250 ok dirdel <13.e0.IM.45.811MSOSI1.102O@maien.com>

LINE 3: d,olaj,asjdfuyjdv,2014-02-07
14-08560,2014-02-07
17:30:14-0800,<1060.eb40.IGNM.1335313.816310169MSOSI1.10S@kashfgjqd.Ighrs.com>,suc,2.0.0 (success),smtp; jgfjasd jsydsj
<13960.e0.Igdf.1335313.816310I1.10@gsdfdrs.Iyre.com> Queued mail for
delivery

现在我想删除 <> 之间的第二次出现的单词。

预期输出:

LINE 1:
type,rcpt,dlvSourceIp,timeLogged,header_Message-Id,bounceCat,dsnStatus,dsnDiag

LINE 2: d,olaj,asjdfuyjdv,2014-02-07
14-08560,<13.e0.IM.45.811MSOSI1.102O@maien.com>,suc,2.0.0
(success),smtp;250 ok dirdel

LINE 3: d,olaj,asjdfuyjdv,2014-02-07 14-08560,2014-02-07
17:30:14-0800,<1060.eb40.IGNM.1335313.816310169MSOSI1.10S@kashfgjqd.Ighrs.com>,suc,2.0.0 (success),smtp; jgfjasd jsydsj Queued mail for delivery

因为在输出中 < 和 > 之间第二次出现的数据被删除...

我试过下面的命令,但它正在删除所有匹配的字符串。但我只想删除第二个字符串。

sed 's/<.*.>//' test.txt

任何帮助都非常有用。

最佳答案

你可以试试:

sed 's/\(<[^>]*>\)\(.*\)\(<[^>]*>\)/\1\2/' test.txt
  1. 检查 < >
  2. 然后检查任何文本
  3. 然后检查第二个 < >

输出:
只有 1 和 2

关于regex - 如何从 linux 中的文件的每一行中删除与模式匹配的重复单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21759365/

相关文章:

regex - 如何结合负向前瞻和负向前瞻

java - 如何在 Java 中将重音字符转换为 HTML 符号?

linux - 使用 Awk 处理每条记录具有不同固定宽度字段的文件

linux - 检查脚本命令中的错误

Bash 命令等到下一整秒

当值分配给变量时,Unix 中的正则表达式问题

Java 正则表达式 - 如何获取符号之间的单词

java - 带符号的拉丁正则表达式

linux - htdig 停止运行 - 加载共享库时出错

linux - 当我尝试运行此脚本时出现意外的文件结尾