Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何避免awk中的转义字符_Perl_Shell_Awk - Fatal编程技术网

Perl 如何避免awk中的转义字符

Perl 如何避免awk中的转义字符,perl,shell,awk,Perl,Shell,Awk,我想这个问题与awk有关。 我没有awk的经验。我试了很多方法,但都找不到解决办法 实际上,我想逐行读取一个文件,然后用perl替换整行 我简化了代码。我希望你能理解 new_line1=1234567 new_line2=1234/567 perl -pi -e "s/$new_line1/$new_line2/g" $FILE 问题是当我使用时与/相关 Number found where operator expected at -e line 1, near "s/1234567/1

我想这个问题与awk有关。 我没有awk的经验。我试了很多方法,但都找不到解决办法

实际上,我想逐行读取一个文件,然后用perl替换整行

我简化了代码。我希望你能理解

new_line1=1234567
new_line2=1234/567

perl -pi -e "s/$new_line1/$new_line2/g" $FILE
问题是当我使用时与
/
相关

Number found where operator expected at -e line 1, near "s/1234567/1234/567"
syntax error at -e line 1, near "s/1234567/1234/567"
因为bash假设
perl-pi-e“s/1234567/1234**/**567/g”$FILE


如何避免它。

如果不想逃避它,请使用与
/
不同的分隔符:

perl -pi -e "s#$new_line1#$new_line2#g" $FILE

如果不想转义,请使用与
/
不同的分隔符:

perl -pi -e "s#$new_line1#$new_line2#g" $FILE

由于您在标题中提到了awk

标准解决方案是使用不同的分隔符。不幸的是,在awk中,您无法直观地编写
\@pattern@
来使用
@
作为分隔符,但您可以显式调用
match

awk 'match( $0, "'$new_line1'" ) { print "'$new_line2'"; next } 1' $FILE
如果
new\u line1
new\u line2
包含
,则此操作无效。
请注意,这不会就地编辑文件。(实际上,
perl-i也不会,因为它会创建一个新文件。)

因为您在标题中提到了
awk

标准的解决方案是使用不同的分隔符。不幸的是,在awk中,您无法按照直觉编写
\@pattern@
以使用
@
作为分隔符,但您可以显式调用
match

awk 'match( $0, "'$new_line1'" ) { print "'$new_line2'"; next } 1' $FILE
如果
new\u line1
new\u line2
包含
,则此操作无效。
请注意,这不会在位编辑文件。(实际上,
perl-i
,也没有,因为它创建了一个新文件。)

@TLP我假设OP想要在原位更新该文件。GNU
sed
提供此功能,但GNU
awk
不提供此功能。@TLP我假设OP希望就地更新文件。GNU
sed
提供了这种能力,但GNU
awk
没有。