为什么我的Perl单线程包含一个转义$不能在Bash反击中工作?

时间:2016-06-10 16:54:25

标签: regex bash perl

我尝试在Bash脚本中使用Perl单行搜索文本文档中的$。我怀疑它将$视为变量。

这是我的代码:

ITEMVALUE=`perl -ne 'print /\$.*/g' file.txt`

文字看起来像这样:

a bunch of random text
$80
a bunch of random text

我只想提取$80。为什么这不起作用,如何检索所需的文字?

2 个答案:

答案 0 :(得分:5)

来自Bash manual

  

命令替换

     

命令替换允许输出命令来替换命令名称。有两种形式:

$(command)
     

`command` 
     

...

     

当使用旧式反引号替换形式时,反斜杠保留其字面含义,除非后跟 $`\。 ..使用$(command)表格时,括号内的所有字符组成命令;没有人特别对待。

(强调补充)

Bash将\中的\$视为转义序列,所以

ITEMVALUE=`perl -ne 'print /\$.*/g' file.txt`

实际上运行

perl -ne 'print /$.*/g' file.txt

$.是一个表示当前行号的Perl内置变量,因此第一行的正则表达式变为/1*/,第二行变为/2*/,依此类推。您将获得包含其自己的行号的任何行的输出。

你可以使用Perl的re pragma

看到这一点
$ ITEMVALUE=`perl -Mre=debug -ne 'print /\$.*/g' file.txt`
Compiling REx "1*"
...
Compiling REx "2*"
...

要修复,请使用$(command)形式的命令替换,这通常是首选:

ITEMVALUE=$(perl -ne 'print /\$.*/g' file.txt)

答案 1 :(得分:0)

它比那更简单 - 这不符合你的想法。

你可能想要:

perl -ne 'print $1 if m/(\$\d+)/'

与正则表达式匹配,捕获值并打印值。 (注意 - 可能会多次匹配)。