在CLi中使用Perl时如何捕获单引号?

时间:2013-06-07 08:36:47

标签: perl command-line-interface

假设我有一个包含以下内容的文本文件:

'Jack', is a boy
'Jenny', is a girl
...
...
...

我想在Cli中使用perl来捕获单引号对之间的名称

cat text| perl -ne 'print $1."\n" if/\'(\w+?)\'/'

以上命令是我跑的但是没有用。似乎“'”与壳牌搞混了。

我知道我们还有其他选择,例如编写perl脚本。但鉴于我的情况,我想在Shell命令行中找到一种方法来实现这一点。

请告知。

2 个答案:

答案 0 :(得分:3)

shell具有连接引用字符串的有趣属性。或者更确切地说,'...'"..."不应被视为字符串,而应视为可用转义的修饰符。 '...' - 命令包围的部分有 no 转义可用。在'...'之外,单引号可以作为\'传递。连同连接属性,我们可以嵌入单引号,如

$ perl -E'say "'\''";'
'

进入-e代码。第一个'退出无法逃脱区域,\'是我们的单引号,'重新进入无逃逸区域。 perl看到了什么

perl        // argv[0]
-Esay "'";  // argv[1]

这会使你的命令

cat text| perl -ne 'print $1."\n" if/'\''(\w+?)'\''/'

(引号不需要在正则表达式中转义)或

cat text| perl -ne "print \$1.qq(\n) if/'(\w+?)'/"

(使用双引号括起命令,但使用qq//表示双引号字符串并转义$符号以避免shell变量插值。

答案 1 :(得分:0)

以下是一些不需要手动转义perl语句的方法:
(免责声明:我不确定这些是多么强大 - 它们尚未经过广泛测试)

  1. Cat-in-the-bag技术

    perl -ne "$(cat)" text
    

    系统将提示您输入。要终止cat,请按 Ctrl - D

    这样做的一个缺点:perl语句不可重用。这可以通过变体来解决:

    $pline=$(cat)
    perl -ne "$pline" text
    


  2. bash builtin,read

    多行:

    read -rd'^[' pline
    

    单行:

    read -r pline
    

    将用户输入读入变量pline

    开关的含义:

    • -r:停止read解释反斜杠(例如,默认read\w解释为w
    • -d:确定read命令结束的字符。
      • ^[是与 Esc 对应的字符,按 Ctrl - V 然后<插入^[ KBD> ESC 点。

  3. Heredoc和剧本。
    (你说没有脚本,但这很快,很脏,所以不妨...)

    cat << 'EOF' > scriptonite
    print $1 . "\n" if /'(\w+)'/
    EOF
    

    然后你就是

    perl -n scriptonite text