在字符串中移动子字符串

时间:2018-11-23 15:04:44

标签: string text awk sed

假定一个长字符串包含多个信息字段(子字符串),每个信息字段括在方括号中。这些字段前面的几个字符是冒号。

目标是将方括号(加上方括号)内的所有字段移动到其紧前面的冒号。

$echo "foo: bar [baz] qux: quux [quix]" | sought_command
foo[baz]: bar qux[quix]: quux

我相信只有 awk 足以实现此目标,但也许 sed 也可以做到这一点。

注意

这是第一次尝试使用 sed

echo "foo: bar [baz] qux: quux [quix]" | sed 's/\[*]\/\:\1\2/g'

这是第一次使用 awk

echo "foo: bar [baz] qux: quux [quix]" | awk -v 'RS=\]' '{print substr($1,1,length($1)-1) $3 "]: " $2}'

2 个答案:

答案 0 :(得分:1)

sed:

sed 's|\([^ :]*\):\([^:[]*\)\(\[[^]]*\]\)|\1\3:\2|g'

这实际上创建了3个组:

  1. \([^ :]*\):不包含冒号且以冒号结尾的任何内容
  2. \([^:[]*\)不包含冒号和方括号的所有内容。注意,您必须在左方括号之前写冒号,因为[:]在sed中的含义不确定。
  3. \(\[[^]]*\]\)在方括号之间。

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -r 's/:([^[]*)([^]]*\]) ?/\2:\1/g' file

:之后的符号上进行模式匹配,并重新排列反向引用。

没有-r选项的语法糖的相同解决方案:

sed 's/:\([^[]*\)\([^]]*\]\) \?/\2:\1/g' file