我正在尝试编写一个perl单行来搜索字符串q(abc *并在找到该字符串时附加到它。我的输入文件有很多这样的东西:
q(abc0x[...
q(abc1x[...
q(abc2x[...
q(abc0y[...
我希望输出为:
q(abc0x_str[...
q(abc1x_str[...
q(abc2x_str[...
q(abc0y_str[...
我试过这个:
perl -pi -e "s/(q\((abc\S+)\[)/\$1_str\1/" file
但$1
反向引用似乎从我的环境中获取值,当我键入echo $1
并预先挂起_str
而不是附加它时,给出此输出:
-project_strq(abc0x[...
$1
恰好在我的环境中是“-project”。
或者,我试过了:
perl -pi -e "s/(q\(abc\S+)\[)/_str\1/" file
但是此处的输出与预先_str
:
_strq(abc0x[...
两种输出都不是我所期望的。有什么建议吗?
答案 0 :(得分:2)
这会产生您想要的输出:
perl -pi -e 's/(q\(abc\S+)\[/$1_str[/' file
正如您所注意到的,shell将$ 1解释为shell变量。您需要使用单引号来防止shell将其视为变量。
您最初发布的单行为我生成错误(我看到您现在已经编辑了原始代码)。
答案 1 :(得分:0)
$ 1由bash解释,因为你在“...”中引用你的perl代码。用以下内容替换你的单线:
FromKnowColor
与Perl一样,单引号不会解释内容。
我还修复了perl -pi -e 's/(q\(abc\S+)\[)/$1_str[/' file
,将其替换为\1
。