3

我有一个包含许多文本文件的目录层次结构。我想每次出现在一个文件中时搜索一个特定的文本字符串,然后用另一个字符串替换它。例如,我可能想用“Pepsi”替换字符串“Coke”的每次出现。有谁知道如何做到这一点?我想知道是否有某种 Bash 命令可以做到这一点,而不必在编辑器中加载所有这些文件,或者想出一个更复杂的脚本来做到这一点。

我发现这个页面解释了一个使用 sed 的技巧,但它似乎不适用于子目录中的文件。

4

7 回答 7

15

sed与 结合使用find。例如:

find . -name "*.txt" | xargs sed -i s/Coke/Pepsi/g

或者

find . -name "*.txt" -exec sed -i s/Coke/Pepsi/g {} \;

(有关更多信息,请参见 find 的手册页)

于 2010-05-18T19:01:07.077 回答
3

IMO,这个任务最容易使用的工具是rpl

rpl -R Coke Pepsi .

-R用于递归替换所有子目录)

于 2010-05-18T19:02:45.407 回答
3

像这样将 sed 与 find 结合使用:

find . -name "file.*" -exec sed -i 's/Coke/Pepsi/g' {} \;
于 2010-05-18T19:02:56.773 回答
3

find . -type f -exec sed -i 's/old-word/new-word/g' {} \;

于 2010-05-18T19:03:09.357 回答
2

我通常用perl来做。但是请注意 - 它使用比普通字符串替换更强大的正则表达式:

% perl -pi -e 's/Coke/Pepsi/g;' $filename

编辑我忘记了子目录

% find ./ -exec perl -pi -e 's/Coke/Pepsi/g;' {} \;
于 2010-05-18T19:02:19.013 回答
2

你想要一个find和的组合sed

于 2010-05-18T19:04:07.607 回答
0

您还可以:

用 find & ed 搜索和替换

http://codesnippets.joyent.com/posts/show/2299

(它还具有通过 -t 标志的测试模式)

于 2010-06-28T09:19:01.717 回答