perl匹配关键字并修改关键字

时间:2013-01-03 12:25:25

标签: regex perl

我首先设置了一个环境变量X.

> setenv X "abc 12_3 abc"

然后我在perl中编写了一个正则表达式,尝试将第一列与空格匹配,剩下的字符串也是2美元。 在这里我打印第一场比赛$ 1

> echo $X|perl -lne '$_=~m/([^\s]*[\s])(.*)/;print $1'
abc 

这里我打印第二场比赛$ 2。

> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;print $2'
12_3 abc

直到现在看起来一切正常。 现在我想把第二场比赛中的所有下划线替换成空格

> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;$2=~s/_/ /g;'
Modification of a read-only value attempted at -e line 1, <> line 1.

好的错误消息说$ 2是只读的。好吧。 所以我将$ 2复制到一些临时变量$ temp。 所以虽然复制它的罚款,$ 1和$ 2仍然存在,如下所示:

> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;$temp=$2;print $1.$2'
abc 12_3 abc

现在我尝试用临时字符串$ temp。

中的空格替换下划线
> echo $X | perl -lne '$_=~m/([^\s]*[\s])(.*)/;$temp=$2;$temp=~s/_/ /g;print $1.$2'

> 

我的问题是$ 1和$ 2去了哪里? 即使我改变了$ temp,如果改变$ 2发生了至少1美元的事情呢?

2 个答案:

答案 0 :(得分:10)

语句$temp=~s/_/ /g重置匹配变量;因此,如果您想在新的匹配/替换后使用,则必须将其存储在变量...

答案 1 :(得分:1)

s/_/ /g成功,并且不包含任何捕获,因此它将所有捕获变量设置为undef。

此代码将执行您想要的操作:

perl -nle'($x,$y)=/^(\S*\s+)(.*)/; $y =~ s/_/ /g; print $1.$2;'

甚至:

perl -ple's/^\S*\s+\K(.*)/ ($x=$1) =~ s{_}{ }g; $x /e;'

甚至(5.14 +):

perl -ple's/^\S*\s+\K(.*)/ $1 =~ s{_}{ }gr /e;'