1

假设我有一个文本文件,其内容如下:

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

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

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

上面的命令是我运行的,但它没有用。似乎“'”与 Shell 混淆了。

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

请指教。

4

2 回答 2

3

shell 具有连接带引号的字符串的有趣特性。或者更确切地说,'...'或者"..."不应该被视为字符串,而是可用转义的修饰符。命令的'...'-surrounded 部分没有可用的转义符。在 之外'...',单引号可以作为 传递\'。与连接属性一起,我们可以嵌入一个单引号,例如

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

进入-e代码。第一个'退出 no-escape 区域,\'是我们的单引号,然后'重新进入 Escapeless 区域。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 变量插值)。

于 2013-06-07T08:49:57.817 回答
0

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

  1. 猫在袋子里的技术

    perl -ne "$(cat)" text
    

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

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

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


  2. bash 内置,read

    多行:

    read -rd'^[' pline
    

    单线:

    read -r pline
    

    将用户输入读入变量pline

    开关的含义:

    • -r: 停止read解释反斜杠(例如默认read解释\ww
    • -d: 确定read命令结束的字符。
      • ^[是对应的字符,您通过按-thenEsc插入。^[CtrlVEsc

  3. Heredoc和脚本。
    (你说没有脚本,但这又快又脏,所以还不如......)

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

    那么你只是

    perl -n scriptonite text
    
于 2013-06-07T15:00:07.363 回答