我需要替换一个文件夹中的许多文件中的字符串,只有ssh访问服务器。我该怎么做呢?
当前回答
有一个更简单的方法,使用一个简单的脚本文件:
# sudo chmod +x /bin/replace_string_files_present_dir
在gedit或你选择的编辑器中打开文件,我在这里使用gedit。
# sudo gedit /bin/replace_string_files_present_dir
然后在编辑器中将以下内容粘贴到文件中
#!/bin/bash
replace "oldstring" "newstring" -- *
replace "oldstring1" "newstring2" -- *
#add as many lines of replace as there are your strings to be replaced for
#example here i have two sets of strings to replace which are oldstring and
#oldstring1 so I use two replace lines.
保存文件,关闭gedit,然后退出您的终端,或者只是关闭它,然后启动它,以便能够加载您添加的新脚本。
导航到有多个要编辑的文件的目录。然后运行:
#replace_string_files_present_dir
按enter键,这将自动将包含它们的所有文件中的oldstring和oldstring1分别替换为正确的newstring和newstring1。
它将跳过不包含旧字符串的所有目录和文件。
如果您有多个目录的文件需要替换字符串,这可能有助于消除乏味的输入工作。你所要做的就是导航到这些目录,然后运行:
# replace_string_files_present_dir
你所要做的就是确保你已经包括或添加了所有替换字符串,就像我上面展示的那样:
替换 “oldstring” “newstring” -- *
在文件/bin/replace_string_files_present_dir的末尾。
要添加一个新的替换字符串,只需打开我们创建的脚本,在终端中输入以下命令:
Sudo gedit /bin/replace_string_files_present_dir
不要担心你添加的替换字符串的数量,如果没有找到oldstring,它们将没有任何影响。
其他回答
这招对我很管用:
find ./ -type f -exec sed -i 's/string1/string2/' {} \;
sed -i 's/string1/string2/g' *。也许“foo”不是string1,“bar”不是string2。
要替换多个文件中的字符串,您可以使用:
grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'
E.g.
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
源的博客
我对许多答案的问题是,我需要替换许多文件中的文件路径。虽然有一个答案提到了这一点,但对我来说并不管用。我的解决方案:
首先,生成一个要更改的文件名列表。
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执行操作。
rpl
对于大多数快速使用,您可能会发现rpl命令更容易记住。
在所有。txt文件上用bar替换foo:
rpl -v foo bar '*.txt'
模拟替换正则表达式foo。*在所有.txt文件中递归地使用bar:
rpl --dry-run 'foo.*' bar '**/*.txt'
您可能需要安装它(apt-get install rpl或类似的方法)。
repren
然而,对于涉及正则表达式和反向替换,或文件重命名以及搜索和替换的更困难的工作,我所知道的最通用和最强大的工具是repren,这是我不久前为一些棘手的重命名和重构任务编写的一个小Python脚本。你可能更喜欢它的原因是:
支持重命名文件以及搜索和替换文件内容。 在执行搜索和替换之前查看更改。 支持带有反向替换、整词、大小写不敏感和保留大小写(replace foo -> bar, foo -> bar, foo -> bar)模式的正则表达式。 适用于多个替换,包括互换(foo -> bar和bar -> foo)或非唯一替换集(foo -> bar, f -> x)。
使用它,pip安装repren。查看README中的示例。
使用ack命令会快得多,像这样:
ack '25 Essex' -l | xargs sed -i 's/The\ fox \jump/abc 321/g'
如果你在搜索结果中有空白。你需要逃离它。