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

时间:2014-02-13 16:05:49

标签: 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

现在我要删除介于&lt;&gt;之间的单词的第二次出现。

预期产出:

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

如同在第二次出现的数据之间&lt;和&gt;被删除......

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

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

任何帮助都非常有用。

3 个答案:

答案 0 :(得分:2)

您可以尝试:

sed 's/\(<[^>]*>\)\(.*\)\(<[^>]*>\)/\1\2/' test.txt
  1. 检查&lt; &GT;
  2. 然后检查任何文字
  3. 然后检查第二个&lt; &GT;
  4. 输出:
    只有1和2

答案 1 :(得分:1)

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

sed 's/\(<[^>]*>\)\(.*\)<[^>]*>/\1\2/'

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

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

答案 2 :(得分:0)

这可能适合你(GNU sed):

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