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



我有一个如下所示的文件

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/(<[^>]*>)(.*)(<[^>]*>)/12/' test.txt
  1. 检查<>
  2. 然后检查是否有任何文本
  3. 然后检查第二个<>

输出:
只有 1 和 2

您可以使用反向引用来引用刚刚匹配的模式,如下所示:

sed 's/(<[^>]*>)(.*)<[^>]*>/12/'

您需要的另一个更改是字符类,以停止<.*>匹配第一个<和最后一个>之间的所有内容。

ETA:正如Abhishek所指出的,允许<>之间的第二组与第一组不同。

这可能对你有用(GNU sed):

sed 's/<[^>]*>//2' file

相关内容

  • 没有找到相关文章

最新更新