gpt4 book ai didi

bash - 在 Mac 上使用 sed 递归地用空格替换字符串

转载 作者:行者123 更新时间:2023-11-29 09:28:22 26 4
gpt4 key购买 nike

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

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

最佳答案

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

无论您是哪种类型的巫师,您都已将 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,我不像 blaster 那样笨拙或随意。我来自一个更文明的时代,那里的一切都是 ASCII”。

Stack Overflow问题有一个稍微复杂的解决方法(调整 LANG 属性)。我不知道这是否是个好主意。

我个人的做法是限制您的查找,以便只包含具有特定扩展名的文件。您可以使用 -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 文件。您可以使用另一个 -o -name '*.js' 添加 js 文件。 Magento 代码库中应该只有少数文件类型带有版权声明。

关于bash - 在 Mac 上使用 sed 递归地用空格替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19733911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com