我首先设置了一个环境变量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美元的事情呢?
答案 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;'