切割匹配并放入另一个位置

时间:2013-03-26 18:52:36

标签: linux bash sed awk

如何剪切方括号内的数字并将它们放在文本的开头?

例如:

some_text123_[12345]_some_text

after:
12345_some_text123_[]_some_text

3 个答案:

答案 0 :(得分:1)

尝试使用sed,匹配:

  1. 一组字符
  2. 括号,然后是数字,然后是另一个括号
  3. 另一组角色
  4. 正则表达式可能是(.*) (\[[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