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

Perl 如何在linux上使用脚本替换现有文件中的文本?,perl,shell,Perl,Shell,我想用XYZ替换abc,在名为test.sh的文件中为其编写了下面的脚本;使用sh test.sh命令在终端上执行该文件 i='abc'; 命令: perl -pi -e 's/$i/XZY/g' /home/user/Desktop/file.txt gedit文件.txt 但结果是: XYZaXYZbXYZc XYZ 无法找出问题所在。问题在于您使用的单引号会阻止变量展开。因此,您执行的命令本质上等同于说: perl -pi -e 's//XZY/g' /home/user/Deskt

我想用
XYZ
替换
abc
,在名为
test.sh
的文件中为其编写了下面的脚本;使用
sh test.sh
命令在终端上执行该文件

i='abc';
命令:

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

但结果是:

XYZaXYZbXYZc
XYZ

无法找出问题所在。

问题在于您使用的单引号会阻止变量展开。因此,您执行的命令本质上等同于说:

perl -pi -e 's//XZY/g' /home/user/Desktop/file.txt
它对包括换行符在内的每个字符执行替换

使用双引号:

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

问题是您使用的是单引号,这会阻止变量扩展。因此,您执行的命令本质上等同于说:

perl -pi -e 's//XZY/g' /home/user/Desktop/file.txt
它对包括换行符在内的每个字符执行替换

使用双引号:

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

问题是您使用的是单引号,这会阻止变量扩展。因此,您执行的命令本质上等同于说:

perl -pi -e 's//XZY/g' /home/user/Desktop/file.txt
它对包括换行符在内的每个字符执行替换

使用双引号:

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

问题是您使用的是单引号,这会阻止变量扩展。因此,您执行的命令本质上等同于说:

perl -pi -e 's//XZY/g' /home/user/Desktop/file.txt
它对包括换行符在内的每个字符执行替换

使用双引号:

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

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

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

要匹配
/
必须对其进行转义。
\/
。新的问题是,在构建原始字符串时,必须对
\
进行转义

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

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

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

要匹配
/
,必须将其转义<代码>\/。新的问题是,在构建原始字符串时,必须转义
\

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

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

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

要匹配
/
必须对其进行转义。
\/
。新的问题是,在构建原始字符串时,必须对
\
进行转义

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

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

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

要匹配
/
,必须将其转义<代码>\/。新的问题是,在构建原始字符串时,必须转义
\

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

's/$i/XZY/g' 
这里使用单引号可以防止发生变量插值,因此
$i
作为文本传递给Perl解释器。由于您没有在Perl one liner中定义
$i
,因此正则表达式变为

s//XYZ/g
或者换句话说,在文件中的每个字符后插入“XYZ”

解决方法是使用双引号代替。

问题是

's/$i/XZY/g' 
这里使用单引号可以防止发生变量插值,因此
$i
作为文本传递给Perl解释器。由于您没有在Perl one liner中定义
$i
,因此正则表达式变为

s//XYZ/g
或者换句话说,在文件中的每个字符后插入“XYZ”

解决方法是使用双引号代替。

问题是

's/$i/XZY/g' 
这里使用单引号可以防止发生变量插值,因此
$i
作为文本传递给Perl解释器。由于您没有在Perl one liner中定义
$i
,因此正则表达式变为

s//XYZ/g
或者换句话说,在文件中的每个字符后插入“XYZ”

解决方法是使用双引号代替。

问题是

's/$i/XZY/g' 
这里使用单引号可以防止发生变量插值,因此
$i
作为文本传递给Perl解释器。由于您没有在Perl one liner中定义
$i
,因此正则表达式变为

s//XYZ/g
或者换句话说,在文件中的每个字符后插入“XYZ”


解决方案是使用双引号代替。

单引号中的字符将在不进行处理的情况下传递给程序。您将两个字符
$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


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

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


单引号中的字符将不经处理传递给程序。您将两个字符
$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


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

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


单引号中的字符将不经处理传递给程序。您将两个字符
$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


如果
$i
包含正则表达式模式(
a*c
应为m