查找和替换一个给定的输入字符串,比如abc,并替换成另一个字符串,比如文件/tmp/file.txt中的XYZ,最简单的方法是什么?
我正在编写一个应用程序,并使用IronPython通过SSH执行命令-但我不太了解Unix,也不知道该寻找什么。
我听说Bash除了是一种命令行界面外,还可以是一种非常强大的脚本语言。所以,如果这是真的,我假设你可以执行这样的操作。
我可以用bash实现它吗?要实现我的目标,最简单的(一行)脚本是什么?
查找和替换一个给定的输入字符串,比如abc,并替换成另一个字符串,比如文件/tmp/file.txt中的XYZ,最简单的方法是什么?
我正在编写一个应用程序,并使用IronPython通过SSH执行命令-但我不太了解Unix,也不知道该寻找什么。
我听说Bash除了是一种命令行界面外,还可以是一种非常强大的脚本语言。所以,如果这是真的,我假设你可以执行这样的操作。
我可以用bash实现它吗?要实现我的目标,最简单的(一行)脚本是什么?
当前回答
最简单的方法是使用sed(或perl):
sed -i -e 's/abc/XYZ/g' /tmp/file.txt
由于-i选项,它将调用sed执行就地编辑。这可以从bash调用。
如果你真的只想使用bash,那么下面的方法可以工作:
while IFS='' read -r a; do
echo "${a//abc/XYZ}"
done < /tmp/file.txt > /tmp/file.txt.t
mv /tmp/file.txt{.t,}
这将遍历每行,执行替换,并写入临时文件(不想破坏输入)。最后的移动只是暂时移动到原来的名称。(为了健壮性和安全性,临时文件名不应该是静态的或可预测的,但我们还是不要这么做。)
Mac用户:
sed -i '' 's/abc/XYZ/g' /tmp/file.txt
(原因请看下面的评论)
其他回答
要以非交互式方式编辑文件中的文本,需要就地文本编辑器,例如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
可以使用rpl命令。例如,你想改变整个php项目的域名。
rpl -ivRpd -x'.php' 'old.domain.name' 'new.domain.name' ./path_to_your_project_folder/
这不是一个明确的bash的原因,但它是一个非常快速和有用的。:)
文件操作通常不是由Bash完成的,而是由Bash调用的程序完成的,例如:
perl -pi -e 's/abc/XYZ/g' /tmp/file.txt
-i标志告诉它进行就地替换。
有关详细信息,请参阅man perlrun,包括如何对原始文件进行备份。
这是一篇旧文章,但对于任何想要使用变量的人来说,@centurian说单引号意味着不会展开任何内容。
获取变量的一个简单方法是做字符串拼接,因为这是通过在bash中并置完成的,以下应该工作:
sed -i -e "s/$var1/$var2/g" /tmp/file.txt
Bash与其他shell一样,只是一个协调其他命令的工具。通常您会尝试使用标准的UNIX命令,但当然您可以使用Bash调用任何东西,包括您自己编译的程序、其他shell脚本、Python和Perl脚本等。
在这种情况下,有几种方法可以做到这一点。
如果你想读取一个文件,并将其写入另一个文件,执行搜索/替换,使用sed:
sed 's/abc/XYZ/g' <infile >outfile
如果你想就地编辑文件(就像在编辑器中打开文件,编辑它,然后保存它),向行编辑器'ex'提供指令
echo "%s/abc/XYZ/g
w
q
" | ex file
示例就像没有全屏模式的vi。您可以向它输入与vi的:prompt相同的命令。