Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 swap命令不使用';似乎无法使用输出重定向_Perl_Unix_Solaris - Fatal编程技术网

Perl swap命令不使用';似乎无法使用输出重定向

Perl swap命令不使用';似乎无法使用输出重定向,perl,unix,solaris,Perl,Unix,Solaris,我的输入是: Grull^Zn Hernand^Zz 其中^Z解析为控制字符\x1a(通过文件上的od-x验证) 当我运行以下Perl命令时: perl -pe s/\x1a//g foo.txt 我得到输出:gruln Hernandz 正如所料。但是,当我将其重定向到一个文件时 perl -pe s/\x1a//g foo.txt > out.txt 这些文件是相同的,如下所示 diff -c out.txt foo.txt No differences encounter

我的输入是:

Grull^Zn Hernand^Zz   
其中^Z解析为控制字符
\x1a
(通过文件上的
od-x
验证)

当我运行以下Perl命令时:

perl -pe s/\x1a//g foo.txt
我得到输出:
gruln Hernandz

正如所料。但是,当我将其重定向到一个文件时

perl -pe s/\x1a//g foo.txt > out.txt
这些文件是相同的,如下所示

diff -c out.txt foo.txt
No differences encountered

我如何才能强制此行为按预期工作?

我不知道您是如何确定第一个版本是否工作的,但它不适合我

您需要在正则表达式中转义反斜杠,或者引用它(引用它更常见)

$hextump-C输入
00000000 61 62 63 1a 64 65 66 1a 67 68 69 0a | abc.def.ghi|
$perl-pes/\x1a//g输入| hextump-C
00000000 61 62 63 1a 64 65 66 1a 67 68 69 0a | abc.def.ghi|
$perl-pe s/\\x1a//g输入| hextump-C
00000000 61 62 63 64 65 66 67 68 69 0a | abcdefghi|
$perl-pe's/\x1a//g'输入| hextump-C
00000000 61 62 63 64 65 66 67 68 69 0a | abcdefghi|
我不认为

perl -pe s/\x1a//g foo.txt
做你认为它能做的事。在任何健全的solaris shell中,未引用的
\x
被视为与
x
相同,并且您运行的是与

perl -pe s/x1a//g foo.txt
您可以通过执行来测试

echo s/\x1a//g
看看有什么传递到外壳上。你也可以试试

perl -pe s/\x1a//g foo.txt | od -c
查看是否确实从输入中删除了控制字符

正确的做法是将单行脚本括在单引号中:

perl -pe 's/\x1a//g' foo.txt > out.txt

我最终所做的(尽管我发现mob的解决方案也有效)不是输入
\x1a
,而是按住
Ctrl
,然后按下
v,z


这样做的好处是可读性更强

那么,这是bash在将行传递到perl之前解释它认为该行应该是什么的实例吗?单引号起作用,使用CTRL+V,Z也起作用