2012-10-20 44 views
0

我需要從擴展名爲.php或.html的所有文件的最開始處刪除任何出現的換行(Mac上的回車)。有像沒有行之間的其他字符提要像空間或任何東西。從特定文件的起始處刪除換行

因此,例如(使用/ LF爲換行的一個例子):

/lf 
/lf 
<!doctype html> 

/lf 
<!doctype html> 

應降低到:的

<!doctype html> 

單程刪除換行我發現是:

tr -d '\012' 

但我不知道如何在特定文件中定位該目標,更不用說只有前幾行。

所以,我有以下幾點:

find . \(-name "*.php" -or -name "*.html" \) | xargs grep -l "\012" | xargs sed -i -e "s/\012//g" 

但這不會只針對第幾行,我不能完全肯定是否正確瞄準線在任何飼料。

那麼,任何人有任何明智的想法?

回答

2

嘗試:

sed -i '/./,$\!d' filename 

或甚至發現:

find . \(-name "*.php" -or -name "*.html" \) -exec sed -i '/./,$\!d' {} \; 

編輯:

\可能不需要的!d之前,在我的殼,我需要逃避它,因爲csh一直認爲我通過指的是前一個事件符號。


編輯2:

所以/./,$\!d,位,它看起來像廢話,但是這是發生了什麼。

  1. 有2個地址在這裏定義,第一個是正則表達式.這是不是一個空白的行。因此,第一個地址是由/./匹配的第一個非空行。
  2. 然後我們有第二個地址,用,分開,它只是$,即文件的結尾。因此,我們通過我們的2個地址定義的區域是第一個非空行,直到文件末尾。
  3. 我們將在此處使用sed的刪除函數,該函數由腳本中的最後一個d表示。但是,通過使用d,我們將刪除從第一個非空行到文件末尾的所有內容。
  4. 最後,因爲我們會刪除我們想要的東西,所以我們在d命令前面使用!來告訴sed,「好的,與我告訴你做的事完全相反」。因此,我們不是從第一個非空白行開始到文件結尾刪除所有內容,而是完全相反,將第一個非空行保留到文件末尾,從而刪除所有文件文件開頭的空白行。

很可能有一些方法來做到這一點使用p(打印)命令,這是有點像刪除的相反的,但並沒有真正表現的方式。我確信有一些方法可以使用p!p來做到這一點。

+0

請問您能解釋'/./,$\!d'這個表達方式的含義嗎? –

+0

我創建了一個測試文件:'seq 4 | sed'1s /.*/ \ n /; 2S /.*/ \ n \ R /; 3S /.*/ \ R /; 4s /.*/ <!doctype html> /''。這裏'sed'/ [[:blank:]] /,$!''效果更好。 – Thor

+0

@BrunovonParis編輯與胡言亂語的詳細解釋的答案。 –

2

如果安裝了Perl,那麼對於這種類型的處理來說,Perl是很好的選擇。你可以做一些「do .. until」循環,一旦它找到一個非空白字符的行就退出。關閉我的頭頂:

do { 

    s/^\s$//; 

} until (/^\S/); 

(但驗證那些正則表達式做你想讓他們到什麼第一!)

0

用途:

find /path/to/root/directory -type f -exec tr -d '\012' {} \; 

其中/路徑/到/根/目錄是查找所有文件以刪除所有事件的頂級路徑。

+0

從文件中刪除所有'\ f'。 OP只需要文件開頭的那些 –

0

如果您知道換行符只位於第一行,例如10行,那麼您可以更改SED命令,以便它僅在前十行上操作。下面是1,10

xargs sed -i -e "1,10s/\012//g"