我有一个包含许多文本文件的目录层次结构。我想每次出现在一个文件中时搜索一个特定的文本字符串,然后用另一个字符串替换它。例如,我可能想用“Pepsi”替换字符串“Coke”的每次出现。有谁知道如何做到这一点?我想知道是否有某种 Bash 命令可以做到这一点,而不必在编辑器中加载所有这些文件,或者想出一个更复杂的脚本来做到这一点。
我发现这个页面解释了一个使用 sed 的技巧,但它似乎不适用于子目录中的文件。
我有一个包含许多文本文件的目录层次结构。我想每次出现在一个文件中时搜索一个特定的文本字符串,然后用另一个字符串替换它。例如,我可能想用“Pepsi”替换字符串“Coke”的每次出现。有谁知道如何做到这一点?我想知道是否有某种 Bash 命令可以做到这一点,而不必在编辑器中加载所有这些文件,或者想出一个更复杂的脚本来做到这一点。
我发现这个页面解释了一个使用 sed 的技巧,但它似乎不适用于子目录中的文件。
sed
与 结合使用find
。例如:
find . -name "*.txt" | xargs sed -i s/Coke/Pepsi/g
或者
find . -name "*.txt" -exec sed -i s/Coke/Pepsi/g {} \;
(有关更多信息,请参见 find 的手册页)
IMO,这个任务最容易使用的工具是rpl
:
rpl -R Coke Pepsi .
(-R
用于递归替换所有子目录)
像这样将 sed 与 find 结合使用:
find . -name "file.*" -exec sed -i 's/Coke/Pepsi/g' {} \;
find . -type f -exec sed -i 's/old-word/new-word/g' {} \;
我通常用perl来做。但是请注意 - 它使用比普通字符串替换更强大的正则表达式:
% perl -pi -e 's/Coke/Pepsi/g;' $filename
编辑我忘记了子目录
% find ./ -exec perl -pi -e 's/Coke/Pepsi/g;' {} \;
你想要一个find
和的组合sed