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