2014-02-13 35 views
0

匹配從文件中的每一行的圖案重複的話我有一個文件類似下面如何刪除在linux

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

LINE 2: d,olaj,asjdfuyjdv,2014-02-07 
14-08560,<[email protected]>,suc,2.0.0 
(success),smtp;250 ok dirdel <[email protected]> 

LINE 3: d,olaj,asjdfuyjdv,2014-02-07 
14-08560,2014-02-07 
17:30:14-0800,<[email protected]>,suc,2.0.0 (success),smtp; jgfjasd jsydsj 
<[email protected]> Queued mail for 
delivery 

現在我想刪除的這些都是<之間>的話第二occurence 。

預期輸出:

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

LINE 2: d,olaj,asjdfuyjdv,2014-02-07 
14-08560,<[email protected]>,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,<[email protected]>,suc,2.0.0 (success),smtp; jgfjasd jsydsj Queued mail for delivery 

如出把數據的第二次出現<和>被刪除之間......

我曾嘗試下面的命令,但它刪除所有匹配的字符串。 。但我只想要第二個字符串被刪除。

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

任何幫助是非常有用的。

回答

2

你可以試試:

sed 's/\(<[^>]*>\)\(.*\)\(<[^>]*>\)/\1\2/' test.txt 
  1. 檢查<>
  2. 然後檢查是否有任何文字
  3. 然後檢查第二<>

輸出:
只有1和2

+0

好一點,我錯過了羣體之間的位。我發現你已經發現了角色類的需求:-) –

+0

是的,謝謝你。 :) –

+0

謝謝.....詳細解釋一下... – vidyadhar

1

可以使用反向引用來引用模式,就像匹配,就像這樣:

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

你需要其他的變化是角色職業,停止<.*>第一<和最後>之間的匹配一切。

ETA:允許第二組<>與第一組不同,正如Abhishek指出的那樣。

+0

第二個< >可能包含不同的文本,所以國際海事組織,你不能把它作爲\ 1 –

+0

我明白你的意思 - 第2行的輸入有相同的,但第3行有他們不同! –

0

這可能爲你工作(GNU SED):

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