2013-11-01 44 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