我想更改文件中每一行的格式,并在其中一个匹配的组上运行另一个替换。
作为一个例子,我可以有一个简单的三列CSV文件(没有转义),我想用另一种格式。
sed -r 's/^([a-z]+),([a-z]+),([a-z]+)$/\1: \3 (\2)'
# would turn "comma,separated,values"
# into "comma: values (separated)"
但是,我还想要删除第二列中的所有元音,即在s/[aeiou]//g
上运行\2
。
这个嵌套替换问题有一个很好的解决方案吗?请假设两个替换都很复杂,这只是一个例子。
我的sed不是GNU sed 4.0版。
答案 0 :(得分:1)
这是神秘的(几乎任何非平凡的sed),但它会完成这项工作。它利用了你想要修改后的单词最后的事实 - 如果你想让它转到其他位置,同样的技巧会起作用,但命令会更长一些。
sed 'h;s/.*,([a-z]+),.*/(\1)/;s/[aeiou]//g;x;s/([a-z]+),[a-z]+,([a-z]+)/\1: \2 /;G;s/\n//'
或者用英语:“将一个副本保存在保持缓冲区中,除了第二个字之外全部删除,删除元音,交换缓冲区,重新排列单词(删除中间单词),将另一个缓冲区添加到结尾,删除新行“。
答案 1 :(得分:0)
我认为你最好使用awk
这个,以便更容易操作这些字段。
echo "gaviidae,gruidae,picidae" | awk -F "," '{gsub(/[aeiou]/, "", $2); printf("%s: %s (%s)\n", $1, $3, $2)}'
输出:
gaviidae: picidae (grd)