我想将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
无法弄清楚问题。
答案 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