繁体   English   中英

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

[英]How to capture single quote when using Perl in CLi?

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

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

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

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

上面的命令是我跑的,但它不起作用。 似乎“'”搞砸了壳牌。

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

请指教。

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

$ 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//用于双引号字符串并转义$ sigil以避免shell变量插值)。

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

  1. Cat-in-the-bag技术

     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命令。
      • ^[是与Esc对应的字符,你插入^[Ctrl - V然后按Esc

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

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

    那么你简单

     perl -n scriptonite text 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM