我需要替换一个文件夹中的许多文件中的字符串,只有ssh访问服务器。我该怎么做呢?
当前回答
在MacBook Pro上,我使用了以下方法(灵感来自https://stackoverflow.com/a/19457213/6169225):)
sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *
-i "将确保您没有备份。 -e表示现代正则表达式。
其他回答
这招对我很管用:
find ./ -type f -exec sed -i 's/string1/string2/' {} \;
sed -i 's/string1/string2/g' *。也许“foo”不是string1,“bar”不是string2。
要替换文件中的路径(避免转义字符),您可以使用以下命令:
sed -i 's@old_path@new_path@g'
@符号意味着在接下来的字符串中所有的特殊字符都应该被忽略。
如果文件包含反斜杠(通常是路径),你可以尝试这样做:
sed -i -- 's,<path1>,<path2>,g' *
ex:
sed -i -- 's,/foo/bar,/new/foo/bar,g' *.sh (in all shell scripts available)
如果你有可以使用的文件列表
replace "old_string" "new_string" -- file_name1 file_name2 file_name3
如果你有所有可以使用的文件
replace "old_string" "new_string" -- *
如果你有文件扩展名列表,你可以使用
replace "old_string" "new_string" -- *.extension
我对许多答案的问题是,我需要替换许多文件中的文件路径。虽然有一个答案提到了这一点,但对我来说并不管用。我的解决方案:
首先,生成一个要更改的文件名列表。
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命令利用了这个问题的其他答案,并使用+作为分隔符而不是普通的/,因为文件路径中使用了/字符。
推荐文章
- 如何找到Java堆大小和内存使用(Linux)?
- 遍历带空格的文件列表
- c#:如何获得一个字符串的第一个字符?
- String类中的什么方法只返回前N个字符?
- Bash:无限睡眠(无限阻塞)
- 如何使Python脚本在Linux中像服务或守护进程一样运行
- 我可以将c#字符串值转换为转义字符串文字吗?
- 在c#中解析字符串为日期时间
- 如何使用文件的行作为命令的参数?
- 字符串中的单词大写
- time_t最终的类型定义是什么?
- string.ToLower()和string.ToLowerInvariant()
- PHP字符串中的花括号
- 如何删除字符串的第一个和最后一个字符
- 如何使用cut为分隔符指定更多的空格?