如何剪切方括号内的数字并将它们放在文本的开头?
例如:
some_text123_[12345]_some_text
after:
12345_some_text123_[]_some_text
答案 0 :(得分: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
答案 1 :(得分:1)
我尝试使用perl
。
这个perl one衬垫应该可以工作。
$ echo some_text123_[123]_some_text | perl -ne 'print "$1_", "$`", "$'\''\n" if /\[(\d+?)\]/;' -
只是解释perl regex引擎的特殊变量:
$ 1 - 这是我想要保留的匹配。
$` - 比赛前的一切
$' - 匹配后的所有内容
答案 2 :(得分:1)
这是另一种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