用多行字符串替换多行字符串,而无需手动转义

克沃特

假设我有一个文本文件,text.txt并且想before.txt用另一个包含在其中的字符串替换其中包含的(多行)字符串,after.txt我该怎么做?(我不想使用正则表达式我硬是要替换包含在字符串before.txt与文本中包含after.txttext.txt

我希望使用以下建议的方法:https : //unix.stackexchange.com/a/26289/288916

我试过了:

perl -i -p0e 's/`cat before.txt`/`cat after.txt`/se' text.txt

但是,除非我是一个完整的白痴,并且弄乱了一些琐碎的东西,否则我不能简单地将其扩展为从使用cat的文件中加载字符串。

转义可能出了点问题。该文件before.txt包含诸如的符号/[]"


谢谢@ilkkachu,我尝试了:

perl -i -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; s/\Q$b\E/$a/s\' text.txt

,但仍无法正常工作。我通过确保之前的字符串与要替换字符串的整行完全匹配来使它在一个实例中起作用。但是,例如替换在行首找不到的字符串不起作用。示例:text.txt文件包含:

Here is 
some text.

before.txt 包含: text

after.txt 包含: whatever

没有机会。

伊尔卡楚
perl -i -p0e 's/`cat before.txt`/`cat after.txt`/se' text.txt

在这里,您在单引号内有反引号,因此Shell不会处理它们,但是Perl照原样查看它们。再说一次,Perl支持反引号作为一种报价形式,但是在内部不起作用s///

只要您在Perl命令行上使用-0-0777在命令行上使用多行模式就没有问题-0它将用NUL字符分隔行,这是文本文件所没有的,并且-0777将一次性读取整个文件。)

您可以使用双引号来完成此操作,但这将直接在Perl脚本中扩展文件的内容,并且任何特殊字符都将作为脚本的一部分。单个斜杠将终止s///操作员并引起问题。

而是让Perl读取文件:

perl -i -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; s/$b/$a/s' text.txt

在此,的内容before.txt仍将视为正则表达式。如果要停止该操作,请s/\Q$b\E/$a/s改用。

我不认为您也不想使用该e标志s///,它将使替换作为Perl表达式使用(这仅在您具有将Shell扩展文件内容到Perl命令行的情况下才有意义)。


在后面的示例中,您具有some text.\nintext.txttext\nin before.txt,其中\n和往常一样代表换行符。将文件加载到Perl中后,它们将保持原样,因此最后的换行before.txt计数。另一个文件在换行符之前有一个点,另一个文件则没有,因此它们不匹配。

chomp $b; 加载文件后, 您可以删除可能的尾随换行符 您可以使用以下命令删除可能的尾随换行符$b =~ s/\n$//;

$ perl -0 -pe '$b = `cat before.txt`; $a = `cat after.txt`; $b =~ s/\n$//; $a =~ s/\n$//; s/$b/$a/s' text.txt
Here is 
some whatever.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章