我需要替换一个文件夹中的许多文件中的字符串,只有ssh访问服务器。我该怎么做呢?


当前回答

在我发现这个问题(和答案)之前,我确实编造了自己的解决方案。 我搜索了“replace”、“few”和“xml”的不同组合,因为那是我的应用程序,但没有找到这个特定的组合。

我的问题:我有spring xml文件,其中包含测试用例的数据,其中包含复杂的对象。java源代码上的重构改变了许多类,但不适用于xml数据文件。为了保存测试用例数据,我需要更改所有xml文件中的所有类名,这些文件分布在几个目录中。同时保存原始xml文件的备份副本(尽管这不是必须的,因为版本控制可以在这里保存我)。

我正在寻找find + sed的某种组合,因为它在其他情况下也适用,但不能同时使用几个替换。

然后我找到了ask ubuntu response,它帮助我构建了我的命令行:

find -name "*.xml" -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

而且效果非常好(好吧,我的箱子有六种不同的替代品)。但请注意,它将触及当前目录下的所有*.xml文件。正因为如此,如果你要对版本控制系统负责,你可能想要先进行过滤,只将那些实际拥有你想要的字符串传递给sed;如:

find -name "*.xml" -exec grep -e "firstWord" -e "secondWord" -e "thirdWord" {} \; -exec sed -s --in-place=.bak -e 's/firstWord/newFirstWord/g;s/secondWord/newSecondWord/g;s/thirdWord/newThirdWord/g' {} \;

其他回答

如果你有可以使用的文件列表

replace "old_string" "new_string" -- file_name1 file_name2 file_name3

如果你有所有可以使用的文件

replace "old_string" "new_string" -- *

如果你有文件扩展名列表,你可以使用

replace "old_string" "new_string" -- *.extension
cd /path/to/your/folder
sed -i 's/foo/bar/g' *

出现的“foo”将被替换为“bar”。

在像macOS这样的BSD系统上,你需要提供一个备份扩展名,比如-i '.bak',否则每个manpage都会“冒损坏或部分内容的风险”。

cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *

在MacBook Pro上,我使用了以下方法(灵感来自https://stackoverflow.com/a/19457213/6169225):)

sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *

-i "将确保您没有备份。 -e表示现代正则表达式。

如果字符串中有正斜杠(/),则可以将分隔符更改为'+'。

find . -type f -exec sed -i 's+http://example.com+https://example.com+g' {} +

该命令将在当前目录中递归地运行。

我使用ag, the_silver_searcher:

ag -0 -l 'old' | xargs -0 sed -ri.bak -e 's/old/new/g';

然后git清除。bak文件(rm在git rebase exec中运行时出现bug)

git clean -f '**/*.bak';