在Mac上使用sed以递归方式用空格替换字符串

时间:2013-11-01 19:21:39

标签: bash magento 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的DocBlocks中的完整字符串是:

* @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'

4 个答案:

答案 0 :(得分:3)

  

显然,某些东西需要转义,但我找不到任何适用的例子。无论如何,我不是一个重击巫师

无论你是什么类型的巫师,你都已经将Stack Overflow矮人送到了Mirkwood。你的问题不是逃脱的命令。以下将运行良好。

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说“wtf,我不像捣蛋鬼那样笨拙或随机。我来自一个文明的时代,一切都是ASCII”。

这个Stack Overflow问题涉及到一些有点愚蠢的工作(jiggering 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代码库中只有少数文件类型带有版权声明。

答案 1 :(得分:0)

试试这个sed:

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

答案 2 :(得分: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

这些文件仍会在文件中放置“& copy; 2013 Magento”

这应该有效:

  

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

答案 3 :(得分: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)