查找和替换一个给定的输入字符串,比如abc,并替换成另一个字符串,比如文件/tmp/file.txt中的XYZ,最简单的方法是什么?

我正在编写一个应用程序,并使用IronPython通过SSH执行命令-但我不太了解Unix,也不知道该寻找什么。

我听说Bash除了是一种命令行界面外,还可以是一种非常强大的脚本语言。所以,如果这是真的,我假设你可以执行这样的操作。

我可以用bash实现它吗?要实现我的目标,最简单的(一行)脚本是什么?


当前回答

你也可以使用ed命令进行文件内搜索和替换:

# delete all lines matching foobar 
ed -s test.txt <<< $'g/foobar/d\nw' 

参见“使用ed通过脚本编辑文件”。

其他回答

要以非交互式方式编辑文件中的文本,需要就地文本编辑器,例如vim。

下面是一个简单的例子,如何从命令行使用它:

vim -esnc '%s/foo/bar/g|:wq' file.txt

这相当于ex editor的@slim answer,基本上是一样的。

这里有一些实际的例子。

在文件中用bar替换文本foo:

ex -s +%s/foo/bar/ge -cwq file.txt

删除多个文件的尾随空格:

ex +'bufdo!%s/\s\+$//e' -cxa *.txt

故障处理(终端卡死):

添加-V1参数以显示详细消息。 强制退出:-cwq!

参见:

如何非交互地编辑文件(例如在管道中)?在Vi SE

对于MAC用户,如果你没有读评论的话:)

正如@Austin提到的,如果您得到无效的命令代码错误

对于就地替换,BSD sed要求在-i标志之后添加一个文件扩展名,以保存到具有给定扩展名的备份文件中。

Sed -i '.bak'的/find/replace' /file.txt

如果您想跳过备份,可以使用“空字符串”。

Sed -i " 's/find/replace' /file.txt

这都是奥斯汀的功劳

如果在多个文件中一起做更改,我们可以在一行中做:-

user_name='whoami'
for file in file1.txt file2.txt file3.txt; do sed -i -e 's/default_user/${user_name}/g' $file; done

补充如果万一可能有用。

如果你正在处理的文件不是很大,并且暂时将它存储在一个变量中是没有问题的,那么你可以在整个文件上使用Bash字符串替换—没有必要逐行检查它:

file_contents=$(</tmp/file.txt)
echo "${file_contents//abc/XYZ}" > /tmp/file.txt

整个文件内容将被视为一个长字符串,包括换行符。

XYZ可以是一个变量,例如$replacement,在这里不使用sed的一个好处是,您不必担心搜索或替换字符串可能包含sed模式分隔符(通常,但不一定是/)。缺点是不能使用正则表达式或sed的任何更复杂的操作。

可以使用rpl命令。例如,你想改变整个php项目的域名。

rpl -ivRpd -x'.php' 'old.domain.name' 'new.domain.name' ./path_to_your_project_folder/  

这不是一个明确的bash的原因,但它是一个非常快速和有用的。:)