3

在试图解决这个问题一小时后宣布破产。这是问题:

我有一个包含 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

显然,有些东西需要转义,但我找不到任何适用的例子。无论如何,我都不是 bash 向导。

这部分表达式的正确格式是什么?

's/(c) 2013 Magento/(c) 2012 Magento/g'
4

4 回答 4

3

显然,有些东西需要转义,但我找不到任何适用的例子。无论如何,我都不是 bash 向导

不管你是什么巫师,你已经把 Stack Overflow 小矮人派到了幽暗密林。您的问题不是命令转义。以下将运行良好。

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问题有一个稍微麻烦的解决方法(调整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 代码库中应该只有少数文件类型带有版权声明。

于 2013-11-01T21:30:12.027 回答
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)
于 2013-11-01T21:07:02.867 回答
0

试试这个 sed:

 sed 's/\(©\) 2013 \(Magento\)/\1 2012 \2/g'
于 2013-11-01T19:27:52.583 回答
0

查找 /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”

这应该有效:

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

于 2013-11-01T20:42:03.887 回答