如何使用linux上的脚本替换现有文件中的文本?

时间:2014-01-09 04:59:45

标签: perl shell

我想将abc替换为XYZ,其中已将以下脚本写在名为test.sh的文件中;使用sh test.sh命令

在终端上执行该文件
i='abc';

命令:

perl -pi -e 's/$i/XZY/g' /home/user/Desktop/file.txt

gedit file.txt

但输出是:

XYZaXYZbXYZc
XYZ

无法弄清楚问题。

4 个答案:

答案 0 :(得分:1)

问题是您使用单引号来阻止变量扩展。所以你执行的命令基本上等同于:

perl -pi -e 's//XZY/g' /home/user/Desktop/file.txt

执行包括换行符在内的每个字符的替换。

使用双引号:

perl -pi -e "s/$i/XZY/g" /home/user/Desktop/file.txt

答案 1 :(得分:1)

问题是

's/$i/XZY/g' 

这里使用单引号可以保持变量插值的发生,因此$i作为文字传递给Perl解释器。由于您尚未在Perl单行中定义$i,因此正则表达式变为

s//XYZ/g

或换句话说,在文件中的每个字符后插入'XYZ'。

解决方案是使用双引号。

答案 2 :(得分:1)

单引号中的字符无需处理即可传递给程序。您将两个字符$i传递给Perl,而不是shell变量$i的值,因此Perl使用其(空)变量$i的值。


如果$i包含文字(a*c应与a*c匹配),则$i允许包含的内容最为灵活:

perl -i -pe'BEGIN { $text=shift(@ARGV) } s/\Q$text/XZY/g' "$i" file

TEXT="$i" perl -i -pe's/\Q$ENV{TEXT}/XZY/g' file

如果$i包含正则表达式模式(a*c应与a*cccc匹配),那么您需要:

perl -i -pe'BEGIN { $re=shift(@ARGV) } s/$re/XZY/g' "$i" file

RE="$i" perl -i -pe's/$ENV{RE}/XZY/g' file

答案 3 :(得分:0)

我认为您需要使用双引号(")而不是单引号(')。单引号用于文字字符串。

perl -pi -e "s/$i/XZY/g" /home/user/Desktop/file.txt

http://www.perlmonks.org/?node_id=401006

要匹配/你必须逃脱它。 \/。新问题是,当您构建原始字符串时,必须转义\

i="a\\/b";
perl -pi -e "s/$i/XZY/g" /home/user/Desktop/file.txt