我尝试在Bash脚本中使用Perl单行搜索文本文档中的$
。我怀疑它将$
视为变量。
这是我的代码:
ITEMVALUE=`perl -ne 'print /\$.*/g' file.txt`
文字看起来像这样:
a bunch of random text
$80
a bunch of random text
我只想提取$80
。为什么这不起作用,如何检索所需的文字?
答案 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+)/'
与正则表达式匹配,捕获值并打印值。 (注意 - 可能会多次匹配)。