我需要替换一个文件夹中的许多文件中的字符串,只有ssh访问服务器。我该怎么做呢?
当前回答
在MacBook Pro上,我使用了以下方法(灵感来自https://stackoverflow.com/a/19457213/6169225):)
sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *
-i "将确保您没有备份。 -e表示现代正则表达式。
其他回答
假设你想搜索字符串search,并在多个文件中使用replace替换它,这是我久经考验的一行公式:
grep -RiIl 'search' | xargs sed -i 's/search/replace/g'
grep的快速解释:
- r -递归搜索 -i不区分大小写 - i -跳过二进制文件(你想要文本,对吗?) -l输出一个简单的列表。其他命令需要
然后将grep输出通过管道传输到sed(通过xargs),后者用于实际替换文本。-i标志将直接修改文件。把它移开,进行一种“演练”模式。
我对许多答案的问题是,我需要替换许多文件中的文件路径。虽然有一个答案提到了这一点,但对我来说并不管用。我的解决方案:
首先,生成一个要更改的文件名列表。
filelist=($(find /path/to/your/folder | xargs grep '/path/to/fix' | cut -d : -f 1 | tr '\n' ' '))
上面的命令所做的是,管道到grep的find生成包含/路径/到/fix的文件名。然而,grep也打印出字符串所在的行,所以cut命令去掉了这个,只保留文件名。Tr将换行符替换为空格,允许将文件列表存储为数组。
for file in "${filelist[@]}"; do sed -i.bak 's+/path/to/fix+/new/path/for/my/file+g' $file; done
这个sed命令利用了这个问题的其他答案,并使用+作为分隔符而不是普通的/,因为文件路径中使用了/字符。
您也可以使用find和sed,但我发现这一行perl代码工作得很好。
perl -pi -w -e 's/search/replace/g;' *.php
-e表示执行以下代码行。 -i指就地编辑 -w写警告 - p环
(摘自http://www.liamdelahunty.com/tips/linux_search_and_replace_multiple_files.php)
我的最佳结果来自使用perl和grep(以确保文件具有搜索表达式)
perl -pi -w -e 's/search/replace/g;' $( grep -rl 'search' )
类似于Kaspar的答案,但是用g标记来替换一行上的所有出现。
find ./ -type f -exec sed -i 's/old_string/new_string/g' {} \;
对于全局不区分大小写:
find ./ -type f -exec sed -i 's/old_string/new_string/gI' {} \;
如果文件包含反斜杠(通常是路径),你可以尝试这样做:
sed -i -- 's,<path1>,<path2>,g' *
ex:
sed -i -- 's,/foo/bar,/new/foo/bar,g' *.sh (in all shell scripts available)