2017-01-17 60 views
1

我有一個包含許多不同文件夾的目錄。在這些是一些PHP文件。在所有這些文件夾中,我需要在與某個字符串匹配的所有文件中更改第nr行。Bash - sed,在所有匹配的文件中替換行nr 1

所有的文件,我需要改變看起來這對系NR 1:

grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/ 
<?php some text><?php

我需要「<?php

我嘗試這樣做,以取代所有的第一次線

但它只替換一個第一個文件夾中的文件。

我也試過:

grep -rnw something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/ 

但後來我得到這個錯誤:

sed: /somedir/folder//1.php:1:<?php: No such file or directory 

任何想法如何,我可以解決這個問題?

+0

當您刪除空字符串時,您的解決方案正常工作。看我的(測試)答案。 – fancyPants

回答

0
find ./ -iname "*.php" -exec sed '1 s/^<?php some text><?php$/<?php/' -i {} \; 
+1

儘管此代碼片段可能會解決問題,包括對* how *和* why的解釋,這將解決問題[真的有幫助](// meta.stackexchange.com/q/114762)以提高發布的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –

+0

我試過了。它確實找到了所有的文件,但它不會替換第nr行。似乎將文件保留在之前的位置。 – Vega

2
sed -i -e 's/<\?php.*<\?php/<?php/' `find ./ -type f` 

爲了解釋:

sed -i 

運行,使用sed編輯就地

-e 's/ 

替換命令,替換

<\?php.*<\?php 

連續兩個PHP開幕致辭(逃逸問號,因爲這是一個正則表達式)

/ 

<?php 

一個PHP開幕詞

/' 

每行一次。

`find ./ -type f` 

此文件夾,這是一個文件中的一切。

+0

謝謝你的解釋。然而,當我運行它時,發生的只是我得到了一個「>」,我的標記被放置在那裏,就像等待輸入一樣。我在我的Mac上運行我的終端,我不知道這是否與某個方面有關。 – Vega

+0

我的不好 - 我正在用SO語法來爭取命令在那裏沒有逃脫,我不小心在那裏留下了一個反斜槓。刪除它。請再試一次。 – dascandy

+0

這將搜索洞文件。替代第一條線的方法非常低效。 – ceving

0

執行sed時,我不知道空字符串的意圖是什麼。沒有它,它工作完全正常對我來說:

grep -rl something /somedir/folder/ | xargs sed -i '1s/.*/<\?php/' 
+0

當我運行它沒有空字符串,我得到「無效的命令代碼V」。我在我的Mac上使用終端,我不知道這是否與它有關。 – Vega

+0

嗯,我在Linux上測試過它,因爲你用Linux標記了你的問題。我不知道Mac版本是如何還是不同,但空字符串根本沒有意義,因爲''''不是一個字符串,單引號是爲了逃避。 – fancyPants

+0

也許這會有所幫助,當你發佈你嘗試的**完全**時,因爲你發佈的命令中沒有'V'。因此,有了這個錯誤信息,我們只能猜測,什麼是錯的。 – fancyPants

0
grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<\?php/' 

這類作品。但它只會改變它首先找到的文件。而不是所有的文件。所以基本上,如果我有100個文件,我將不得不運行它100次=)

任何想法如何解決這個問題?

0

我找到了解決方案。現在,因爲我在OSX上,顯然sed的工作方式與Linux上的完全不同。我不知道。但這是如何做到的:

find ./ -name \*.php -exec sed -i '' -e '1s/.*/<?php/' {} \; 

我不明白爲什麼它需要像這樣,但它的工作原理。