假设我有一个包含以下内容的文本文件:
'Jack', is a boy
'Jenny', is a girl
...
...
...
我想在Cli中使用perl来捕获单引号对之间的名称
cat text| perl -ne 'print $1."\n" if/\'(\w+?)\'/'
以上命令是我跑的但是没有用。似乎“'”与壳牌搞混了。
我知道我们还有其他选择,例如编写perl脚本。但鉴于我的情况,我想在Shell命令行中找到一种方法来实现这一点。
请告知。
答案 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语句的方法:
(免责声明:我不确定这些是多么强大 - 它们尚未经过广泛测试)
Cat-in-the-bag技术
perl -ne "$(cat)" text
系统将提示您输入。要终止cat
,请按 Ctrl - D 。
这样做的一个缺点:perl语句不可重用。这可以通过变体来解决:
$pline=$(cat)
perl -ne "$pline" text
bash builtin,read
多行:
read -rd'^[' pline
单行:
read -r pline
将用户输入读入变量pline
。
开关的含义:
-r
:停止read
解释反斜杠(例如,默认read
将\w
解释为w
)-d
:确定read
命令结束的字符。
^[
是与 Esc 对应的字符,按 Ctrl - V 然后<插入^[
KBD> ESC 点。 Heredoc和剧本。
(你说没有脚本,但这很快,很脏,所以不妨...)
cat << 'EOF' > scriptonite
print $1 . "\n" if /'(\w+)'/
EOF
然后你就是
perl -n scriptonite text