我有一个类似下面的文件
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
任何帮助都非常有用。
答案 0 :(得分:2)
您可以尝试:
sed 's/\(<[^>]*>\)\(.*\)\(<[^>]*>\)/\1\2/' test.txt
输出:
只有1和2
答案 1 :(得分:1)
您可以使用反向引用来引用刚刚匹配的模式,如下所示:
sed 's/\(<[^>]*>\)\(.*\)<[^>]*>/\1\2/'
您需要的其他更改是字符类,以阻止<.*>
匹配第一个<
和最后>
之间的所有内容。
ETA:允许第二组<>
与第一组不同,正如Abhishek所指出的那样。
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed 's/<[^>]*>//2' file