查找和替换一个给定的输入字符串,比如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

(原因请看下面的评论)

其他回答

可以使用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,包括如何对原始文件进行备份。

您也可以在bash脚本中使用python。我在这里的一些顶级答案上没有太大的成功,并且发现这个不需要循环就能工作:

#!/bin/bash
python
filetosearch = '/home/ubuntu/ip_table.txt'
texttoreplace = 'tcp443'
texttoinsert = 'udp1194'

s = open(filetosearch).read()
s = s.replace(texttoreplace, texttoinsert)
f = open(filetosearch, 'w')
f.write(s)
f.close()
quit()

使用vim编辑器打开文件。命令模式

:%s/abc/xyz/g 

这是最简单的

最简单的方法是使用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

(原因请看下面的评论)