假定一个长字符串包含多个信息字段(子字符串),每个信息字段括在方括号中。这些字段前面的几个字符是冒号。
目标是将方括号(加上方括号)内的所有字段移动到其紧前面的冒号。
$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}'
答案 0 :(得分:1)
sed:
sed 's|\([^ :]*\):\([^:[]*\)\(\[[^]]*\]\)|\1\3:\2|g'
这实际上创建了3个组:
\([^ :]*\):
不包含冒号且以冒号结尾的任何内容\([^:[]*\)
不包含冒号和方括号的所有内容。注意,您必须在左方括号之前写冒号,因为[:]
在sed中的含义不确定。\(\[[^]]*\]\)
在方括号之间。答案 1 :(得分:0)
这可能对您有用(GNU sed):
sed -r 's/:([^[]*)([^]]*\]) ?/\2:\1/g' file
在:
之后的符号上进行模式匹配,并重新排列反向引用。
没有-r
选项的语法糖的相同解决方案:
sed 's/:\([^[]*\)\([^]]*\]\) \?/\2:\1/g' file