perl搜索和追加

时间:2016-10-28 17:49:47

标签: regex perl

我正在尝试编写一个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[...

两种输出都不是我所期望的。有什么建议吗?

2 个答案:

答案 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