如何剪切方括号内的数字并将它们放在文本的开头?
例如:
some_text123_[12345]_some_text
after:
12345_some_text123_[]_some_text
这是另一个 sed 变体,使用保持空间来移动东西。并不是说这是最好的方法,但它很有趣。
sed -e 'h;s/.*\[\([0-9]*\)\].*/\1/;x;s/\[.*\]/[]/;H;g;s/\n//'
h 命令将当前行复制到保持空间中。然后我们隔离 [ 和 ] 之间的数字。x 交换原始行的数字,因此保留空间仅包含数字。然后我们这次丢弃 [] 之间的所有内容,并将结果附加到保存空间中的数字。获取保留空间(g),删除嵌入的换行符,然后就可以了。
$ echo "some_text123_[12345]_some_text" | sed -e 'h;s/.*\[\([0-9]*\)\].*/\1/;x;s/\[.*\]/[]/;H;g;s/\n//'
12345some_text123_[]_some_text
我尝试使用perl
.
这个 perl 一个班轮应该可以工作。
$ echo some_text123_[123]_some_text | perl -ne 'print "$1_", "$`", "$'\''\n" if /\[(\d+?)\]/;' -
只是为了解释 perl 正则表达式引擎的特殊变量:
$1 - 这是我想在匹配时保留的东西。
$` - 比赛前的一切
$' - 比赛后的一切
尝试使用sed
,匹配:
正则表达式可以是(.*) (\[[0-9]+\]) (.*)
(没有空格)。然后,按顺序将匹配替换为组2-1-3
。
$ echo "some_text_[12345]_some_text" | sed "s_(.*)\[([0-9]+)\](.*)_\2\1[]\3_g"
12345some_text_[]_some_text