2

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

例如:

some_text123_[12345]_some_text

after:
12345_some_text123_[]_some_text
4

3 回答 3

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
于 2013-03-26T20:49:38.957 回答
1

我尝试使用perl.

这个 perl 一个班轮应该可以工作。

$ echo some_text123_[123]_some_text | perl -ne 'print "$1_", "$`", "$'\''\n" if /\[(\d+?)\]/;' -

只是为了解释 perl 正则表达式引擎的特殊变量:

$1 - 这是我想在匹配时保留的东西。

$` - 比赛前的一切

$' - 比赛后的一切

于 2013-03-26T19:41:47.130 回答
1

尝试使用sed,匹配:

  1. 一组字符
  2. 一个括号,然后是数字,然后是另一个括号
  3. 另一组字符

正则表达式可以是(.*) (\[[0-9]+\]) (.*)(没有空格)。然后,按顺序将匹配替换为组2-1-3

$ echo "some_text_[12345]_some_text" | sed "s_(.*)\[([0-9]+)\](.*)_\2\1[]\3_g"
12345some_text_[]_some_text
于 2013-03-26T19:00:24.380 回答