2011-09-10 18 views
13

我有一個看起來像這樣的文件複製,並刪除字符:使用SED從重複

@"Afghanistan.png", 
@"Albania.png", 
@"Algeria.png", 
@"American_Samoa.png", 

我希望它看起來像這樣

@"Afghanistan.png", 
@"Afghanistan", 
@"Albania.png", 
@"Albania", 
@"Algeria.png", 
@"Algeria", 
@"American_Samoa.png", 
@"American_Samoa", 

我想我可以用sed要做到這一點,但我不知道如何將某些東西存儲在緩衝區中,然後修改它。

我是否使用正確的工具?

感謝

回答

11

這是很容易做到的SED,你甚至不需要使用保留空間(sed的輔助緩衝)。鑑於input文件如下:

$ cat input 
@"Afghanistan.png", 
@"Albania.png", 
@"Algeria.png", 
@"American_Samoa.png", 

你應該使用這個命令:

sed 's/@"\([^.]*\)\.png",/&\ 
@"\1",/' input 

結果:

$ sed 's/@"\([^.]*\)\.png",/&\ 
@"\1",/' input 
@"Afghanistan.png", 
@"Afghanistan", 
@"Albania.png", 
@"Albania", 
@"Algeria.png", 
@"Algeria", 
@"American_Samoa.png", 
@"American_Samoa", 

這個命令只是一個替代命令(s///)。它匹配任何從@"開始,然後是非時間段字符([^.]*),然後是.png",。此外,它使用組括號\(\)匹配.png",之前的所有非週期字符,因此我們可以獲得該組匹配的內容。因此,這是待替換的正則表達式:

@"\([^.]*\)\.png", 

因此,遵循命令的替換部分。 &命令只是將在@"\([^.]*\)\.png",中匹配的所有內容插入到已更改的內容中。如果它是替換零件的唯一元素,則輸出中不會有任何變化。但是,在&之後有一個換行符 - 由反斜槓\後跟實際換行符表示 - 在新行中,我們添加@"字符串,接着是第一組的內容(\1),然後是字符串",

這只是對命令的簡要說明。希望這可以幫助。另外,請注意,您可以使用\n字符串來表示某些版本的sed(如GNU sed)中的換行符。它會使一個更簡明易讀命令:

sed 's/@"\([^.]*\)\.png",/&\[email protected]"\1",/' input 
+0

傑出線應用重複。你不會開車解釋你的命令行嗎? –

+0

我只是想解釋它甚至在閱讀您的評論:)希望它使解決方案更清晰。很高興回答關於它的任何其餘問題。 – brandizzi

14

你不必讓棘手的正則表達式和替換字符串:用sed的p命令打印線完好,然後修改行,讓它打印暗含

sed 'p; s/\.png//' 
10

格倫傑克曼的回答是確定的,但它也使與表達式不匹配的行加倍。

這其中,代替,雙打僅匹配的表達式中的行:

sed -n 'p; s/\.png//p' 

這裏,-n代表「打印什麼,除非明確地印刷」,並在s/\.png//p所述p強制打印如果取代爲做過,但不強求,否則

8

我寧願這些普約爾薩拉和Glenn傑克曼的:

sed '/.png/p;s/.png//' 

難道只說這是個人p參考。

0

或一個可以結合兩個版本,只有在符合要求的圖形

sed -e '/^@".*\.png",/{p;s/\.png//;}' input