我有一个如下所示的文件
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
您可以使用反向引用来引用刚刚匹配的模式,如下所示:
sed 's/(<[^>]*>)(.*)<[^>]*>/12/'
您需要的另一个更改是字符类,以停止<.*>
匹配第一个<
和最后一个>
之间的所有内容。
ETA:正如Abhishek所指出的,允许<>
之间的第二组与第一组不同。
这可能对你有用(GNU sed):
sed 's/<[^>]*>//2' file