[英]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语句的方法:
(免责声明:我不确定这些是多么强大 - 它们尚未经过广泛测试)
Cat-in-the-bag技术
perl -ne "$(cat)" text
系统将提示您输入。 要终止cat
,请按Ctrl - D 。
这样做的一个缺点:perl语句不可重用。 这可以通过变化来解决:
$pline=$(cat) perl -ne "$pline" text
内置的bash, read
多行:
read -rd'^[' pline
单线:
read -r pline
将用户输入读入变量pline
。
开关的含义:
-r
:从解释反斜杠中停止read
(例如,默认情况下read
解释\\w
为w
) -d
:确定哪个字符结束read
命令。
^[
是与Esc对应的字符,你插入^[
按Ctrl - V然后按Esc 。 Heredoc和脚本。
(你说没有脚本,但这很快又脏,所以不妨...)
cat << 'EOF' > scriptonite print $1 . "\\n" if /'(\\w+)'/ EOF
那么你简单
perl -n scriptonite text
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.