递归替换文件中的字符串

递归替换文件中的字符串

我想page_path\example_filename.txt用正斜杠替换字符串中的反斜杠。我还希望能够在大型文件系统上运行它并让它递归搜索所有目录。

我在网上发现有人说要使用grep, xargssed但我无法让它工作。我一直在尝试分隔符和转义字符的不同变体,但没有得到它。

这是我试图运行的命令:
grep -lr -e 'page_path\\' * | xargs sed -i 's/page_path\/page_path//g'

提前致谢。

答案1

使用 时grep | xargs,您会遇到文件名中的空格、引号、反斜杠(可能还有更多取决于实现xargs)的问题。

grep通过 和的GNU 实现xargs,您可以通过使用: 来避免这些问题,grep -lZr ... | xargs -r0 sed ...它使用零字节作为分隔符。

现在关于 sed 命令:技巧是您可以使用而不是s/a/b/任何其他字符作为分隔符,例如s#a#b#

sed -i 's#page_path\\#page_path/#g'

答案2

您也可以使用 find 来实现:

find /your/path -type f -exec grep -l 'page_path\\' {} \; -exec sed -i 's#page_path\\#page_path/#g' {} \;

仅当第一个执行成功时才会执行第二个执行,并且您不会遇到无法打印或转义文件名中需要字符的问题。

答案3

为什么要浪费 CPU 周期来调用所有这些命令巴什是否已经构建了可以减少打字次数的功能?

例子

str='page_path\example_filename.txt'
echo "${str//\\/\/}"

输出

page_path/example_filename.txt

答案4

ripgrep也可以在这里提供帮助,将 foo 替换为您要匹配的内容,然后在rg调用和sed表达式中进行更改。

rg foo --files-with-matches | xargs sed -i 's/foo/bar/g'

如果您的文件名称中可能有空格,请告诉 ripgrep 用 NULL 字节分隔它们

rg foo --files-with-matches -0 | xargs -0 sed -i 's/foo/bar/g'

来源:https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#search-and-replace

相关内容