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


当前回答

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

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' *

这招对我很管用:

find ./ -type f -exec sed -i 's/string1/string2/' {} \;

sed -i 's/string1/string2/g' *。也许“foo”不是string1,“bar”不是string2。

下面的命令可以用来首先搜索文件和替换文件:

find . | xargs grep 'search string' | sed 's/search string/new string/g'

例如

find . | xargs grep abc | sed 's/abc/xyz/g'

@kev的答案很好,但只影响直接目录中的文件。下面的示例使用grep递归地查找文件。这对我来说每次都很有效。

grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @

命令分解

Grep -r:——recursive,递归地读取每个目录下的所有文件。 Grep -l:——print-with-matches,打印每个有匹配项的文件的名称,而不是打印匹配行。 Grep -i:——忽略大小写。

xargs:将STDIN转换为参数,遵循这个答案。 Xargs -i@ ~命令包含@~:一个占位符,用于~命令中特定位置的参数,@符号是一个占位符,可以被任何字符串替换。

Sed -i:就地编辑文件,不进行备份。 Sed /regexp/replace /:替换匹配regexp的字符串。 Sed s/regexp/replacement/g: global,对每个匹配进行替换,而不是仅对第一个匹配进行替换。

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

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

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

replace "old_string" "new_string" -- *

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

replace "old_string" "new_string" -- *.extension