在试图解决此问题后一小时宣布破产。这是问题:
我有一个包含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'
答案 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)