【问题标题】:Perl swap command doesn't seem to work with output redirectionPerl 交换命令似乎不适用于输出重定向
【发布时间】:2012-11-21 04:01:24
【问题描述】:

我的输入foo.txt 是这样的:

Grull^Zn Hernand^Zz   

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

当我运行以下 Perl 命令时:

perl -pe s/\x1a//g foo.txt

我得到输出:Grulln Hernandz

正如预期的那样。但是,当我将其重定向到文件时

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

文件完全相同,由

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

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

【问题讨论】:

    标签: perl unix solaris


    【解决方案1】:

    我不知道您是如何确定第一个版本有效的,但它不适用于我。

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

    $ hexdump -C input
    00000000  61 62 63 1a 64 65 66 1a  67 68 69 0a              |abc.def.ghi.|
    $ perl -pe s/\x1a//g input | hexdump -C
    00000000  61 62 63 1a 64 65 66 1a  67 68 69 0a              |abc.def.ghi.|
    $ perl -pe s/\\x1a//g input | hexdump -C
    00000000  61 62 63 64 65 66 67 68  69 0a                    |abcdefghi.|
    $ perl -pe 's/\x1a//g' input | hexdump -C
    00000000  61 62 63 64 65 66 67 68  69 0a                    |abcdefghi.|
    

    【讨论】:

      【解决方案2】:

      我不认为

      perl -pe s/\x1a//g foo.txt
      

      做你认为它做的事。在任何健全的 solaris shell 中,未引用的 \x 被视为与 x 相同,并且您运行的操作与

      perl -pe s/x1a//g foo.txt
      

      你可以通过执行来测试这个

      echo s/\x1a//g
      

      并查看传递给 shell 的内容。你也可以试试

      perl -pe s/\x1a//g foo.txt | od -c
      

      查看控制字符是否真的从您的输入中删除。

      正确的做法是将你的单行脚本用单引号括起来:

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

      【讨论】:

      • 那么这是 bash 的一个实例,它在将它传递给 perl 之前解释它认为该行应该是什么?单引号有效,使用CTRL+V,Z 也有效
      【解决方案3】:

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

      这还具有可读性更强的好处。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-14
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多