所以我想在 Perl 中做这样的事情:
if (/number=[0-9]*;/){ print "$&$`$'";}
这在 sed 中可能吗?也就是说,我想隔离一条线的一部分,并将其从中间移动到前面。
答案1
sed 's/\(.*\)\(number=[0-9]*;\)/\2\1/'
但是,如果 出现多次number[0-9]*;
,则会移动最后一个(因为贪婪的 .*
)。移动第一个:
sed -ne 's/number=[0-9]*;/\
&\
/; s/\(.*\)\n\(.*\)\n/\2\1/p'
也就是说,不使用.*
,而是将模式的(这次是第一次)出现在换行符(唯一不能出现在模式空间中的字符)中,这使得下一个s
命令可以唯一地识别匹配。
假设输入是有效文本(特别是不存在不形成有效字符的字节序列)。
您还可以perl
在命令行上使用,例如:
perl -pe 'if (/number=[0-9]*;/) {$_ = "$&$`$'"}'
或者
perl -pe 's/(.*?)(number=[0-9])/$2$1/'
答案2
sed -ne 's/number=[0-9]*;/\n&\n/; s/\(.*\)\n\(.*\)\n\(.*\)/\2\1\3/p'