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

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

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

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


当前回答

这是一篇旧文章,但对于任何想要使用变量的人来说,@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相同的命令。

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

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

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

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

:%s/abc/xyz/g 

这是最简单的

你可以使用sed:

sed -i 's/abc/XYZ/gi' /tmp/file.txt

如果你不知道你的文件名,你可以使用find和sed:

find ./ -type f -exec sed -i 's/abc/XYZ/gi' {} \;

在所有Python文件中查找并替换:

find ./ -iname "*.py" -type f -exec sed -i 's/abc/XYZ/gi' {} \;

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

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

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

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