有没有办法筑巢sed替换?

时间:2011-07-08 12:57:44

标签: regex sed

我想更改文件中每一行的格式,并在其中一个匹配的组上运行另一个替换。

作为一个例子,我可以有一个简单的三列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版。

2 个答案:

答案 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)