sed:在一行中移动元素

sed:在一行中移动元素

所以我想在 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'

相关内容