2012-04-30 98 views
4

我有一系列的,我要轉換爲降價的文本文件。我想刪除任何前導空格並在每個文件的第一行添加散列符號。如果我運行這個:如何使用SED更改多個文件中的第n行?

sed -i.bak '1s/ *\(.*\)/\#\1/g' *.md 

它改變了第一個文件的第一行並處理它們全部,其餘的文件保持不變。

我缺少什麼,將搜索和替換多個文件的第n行的東西嗎?

在OSX 10.7

+0

什麼sed'的'你的系統上的版本。它在Ubuntu 12.04中運行良好。 – kev

+0

@kev它確實是這樣 - 但實際上違背記錄的行爲,這表示'-s'標誌應該是必要的單個文件作爲獨立的流處理。也就是說,OS X不使用GNU工具,因此他可能需要採用shell循環方法。 –

回答

5

使用bash的問題是,在默認情況下治療sed的任意數量的文件作爲單個流,並且因此行號偏移量相對於該第一文件的開始。

對於GNU sed的,你可以使用-s(--separate)標誌修改此行爲:

sed -s -i.bak '1s/^ */#/' *.md 

...或者,與非GNU sed的(包括在Mac OS X中的一個),您可以通過文件循環並調用每一次每一個:

for f in *.md; do sed -i.bak '1s/^ */#/' "$f"; done 

注意,正則表達式是這裏簡化一點 - 無需匹配,你是不是要改變線的部分。

+0

謝謝那正是我需要處理所有文件。我改變了你的第二個答案,目標是第一行:for * in .md;做sed -i.bak'1s/^ * /#/ g'「$ f」;完成 – FrederickYocum

+0

@FrederickYocum感謝您指出監督;我已將它作爲編輯應用於答案。 –

0

xargs的將這樣的伎倆爲您提供:

http://en.wikipedia.org/wiki/Xargs

刪除*從您的sed命令結束.MD,然後使用xargs的收集您的文件,一次一個,並將其發送到您的sed命令作爲一個單一的實體,對不起,我沒有時間去解決它爲你,但維基百科的文章應該表現出你所需要知道的。

+0

問題是不是將它們作爲單個實體發送到sed--問題在於,默認情況下sed將任意數量的文件視爲單個流,因此行號偏移與第一個文件的開始相關。 –

+0

@Charles Duffy:把這個放在你的答案中。 –

+0

@KarolyHorvath完成。 –

0
sed -rsi.bak '1s/^/#/;s/^[ \t]+//' *.md 

你沒有在命令(S)的結束需要克(lobally),因爲你wan't替換在該行的開始,而不是多次的東西。

可以使用兩個命令,一個修改線1(1S ...),從所述第二命令分隔爲前導空白(和標籤:?= \ t)的用分號。要刪除在第一線的空白,切換順序爲:

sed -rsi.bak 's/^[ \t]+//;1s/^/#/' *.md 

刪除\ t如果你不需要它。那麼你不需要一個組:

sed -rsi.bak 's/^ +//;1s/^/#/' *.md 

-r是一個標誌,表示正則表達式的特殊處理。在這種情況下,你不需要掩蓋加號。

+0

這是一個很好的觀點 - 寫出這個問題的英文散文在前導空間修改是否適用於所有行而不是第一行方面是模棱兩可的(儘管其他人的回答,包括我自己在內,都採用了相反的含義, 「第一線」限制旨在適用於這兩種變化)。我有興趣從原作者的意圖中得到澄清。 –

+0

......實際上,我認爲從這個問題的「剩下的文件不變」的短語削減了這種解釋。 –

+0

啊 - 現在我明白了。我的解釋是'我想(刪除任何前導空格)和(在每個文件的第一行添加一個散列符號)',但現在您的解釋是'我想要(除去任何前導空格並添加散列符號)到每個文件中的第一行。「對於我來說似乎更加合理,給出了示例代碼。那只是關於sed選項-s,然後。 –

相關問題