2013-11-01 41 views
3

一小時後宣佈破產嘗試解決此問題。這裏的問題:使用Mac上的sed遞歸替換空格字符串

我有一個文件夾與15,000文件(Magento)。我想將所有版權日期從2013年更改爲2012年,以便我可以在版本之間獲得合法的差異。我試圖用sed,在此基礎上例如:https://stackoverflow.com/a/1583282

此命令工作:

cd path/to/project 
find . -type f -print0 | xargs -0 sed -i '' 's/2013/2012/g' 

除此之外,我顯然不能相信2013只適用於日期。在Magento的文檔塊完整的字符串是:

* @copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com) 

我試圖重寫sed的表達式中使用「(C)2013 Magento的」的字符串,但我得到的錯誤:

sed: RE error: illegal byte sequence 

顯然,有些東西需要轉義,但我找不到任何適用的例子。無論如何,我不是一個猛砸巫師。

這段表達式的正確格式是什麼?

's/(c) 2013 Magento/(c) 2012 Magento/g' 
+0

可能的替代方案:https://gist.github.com/kalenjordan/6766591 –

+0

您的文件是否字面意思是「(c)」或©? –

+0

可能的重複:http://stackoverflow.com/q/11287564/1126841 – chepner

回答

0

試試這個sed的:

sed 's/\(©\) 2013 \(Magento\)/\1 2012 \2/g' 
+0

沒有爲我工作。 –

+0

你可以嘗試:**'sed's/2013。* \(Magento \)/ 2012 \ 1/g'' ** – anubhava

+0

仍然得到:sed:RE錯誤:非法字節序列 –

0

find /full/path/to/magento -type f -print0 | xargs -0 sed -i '' 's/(c) 2013 Magento/(c) 2012 Magento/g'

但是:

grep -lir -e '2013 Magento' /full/path/to/magento /full/path/to/magento/app/code/core/Enterprise/Enterprise/etc/config.xml /full/path/to/magento/app/code/core/Mage/Page/etc/config.xml /full/path/to/magento/app/locale/en_US/Mage_Page.csv /full/path/to/magento/errors/default/page.phtml /full/path/to/magento/errors/enterprise/page.phtml /full/path/to/magento/downloader/template/footer.phtml /full/path/to/magento/downloader/template/install/footer.phtml

這些文件仍會有 「&複印件; 2013 Magento的」 放置在文件

這應該是wor K:

find /full/path/to/magento -type f -print0 | xargs -0 sed -i '' 's/2013 Magento/2012 Magento/g'

+0

沒有。出現此錯誤:sed:1:「./.!14184!.DS_Store」:無效的命令代碼。 –

+0

從這個命令:find。 -type f -print0 | xargs -0 sed -i's/2013 Magento/2012 Magento/g' –

+0

對不起。「在Mac上」編輯我的答案。 – Richu

0

只需逃脫括號似乎爲我工作:

$ sed 's/\(c\) 2013 Magento/\(c\) 2012 Magento/g' <<< "@copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)" 
@copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com) 
3

Obviously, something needs to be escaped but I can't find any applicable examples. I am not a bash-wizard by any means

你不管排序嚮導,您發送的堆棧溢出相形見絀到幽暗密林。你的問題不是命令轉義。以下將運行良好。

find . -type f -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' 

通過在空目錄中運行它進行測試。

$ mkdir tmp-gandalf 
$ cd tmp-gandalf 
$ find . -type f -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' 

如果你有一個shell轉義問題,你的系統會在這裏抱怨它。

這是問題所在。您的命令的第一部分找到所有文件上

find . -type f -print0 

使用-type f操作發現所有文件。包括非文本文件。 sed命令不喜歡非文本文件。嘗試類似這樣的

sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' /path/to/some.gif 
find . -name '*.php' -o -name '*.xml' -o -name '*.phtml' 

其中/path/to/some.gif是一個二進制文件。你會看到你的sed: RE error: illegal byte sequence錯誤。這就是sed,他說:「我不是笨拙的或隨機的,我來自一個更加文明的時代,一切都是ASCII的。 (LANG屬性)。如果這是一個好主意,我不太相信。

我個人的做法是限制你的find這樣只包含具有特定擴展名的文件。您可以使用-o選項指定多個名稱模式。因此,像這樣

//NOTE: each -o needs its own -print0 
find . -name '*.php' -print0 -o -name '*.xml' -print0 -o -name '*.phtml' -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' 

將搜索.php.xml.phtml文件。您可以將js文件與另一個-o -name '*.js'相加。 Magento代碼庫中只有少數幾種文件類型具有版權聲明。

+0

二進制文件問題非常有意義,並感謝您使用正確的LOTR/SW措辭,所以我會理解。使用多個名稱參數運行最終命令會執行,但替換不會寫入文件中。我明白這就是「sed -i」參數所要做的,但似乎並沒有這種效果。我也嘗試添加{}到結尾(我認爲這將管道從「查找」命令的文件列表變爲「sed」但沒有任何效果。任何想法? –

+0

我很確定你需要添加-e所以你的命令會看起來像這樣find。-name「* .xml」-type f -exec sed -i -e's/RegEx/Replacement/g'{} \; – peekay