我可以在sed中提到从不同模式到其他模式的反向引用

时间:2013-01-09 02:16:09

标签: regex linux sed

假设我有这个数据

1:a:b:c
2:d:e:f
3:a:b
4:a:b:c:d:e:f

我想要的输出是

1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f

我从this questions

那里得到了

我正在尝试的解决方案是

sed -re 's/^([0-9]):/\1/g;s/:/L/g' temp.txt

我有两种不同的模式。我只想知道我可以在第二种模式中使用\1

像这样

sed -re 's/^([0-9]):/\1/g;s/:/\1/g' temp.txt

3 个答案:

答案 0 :(得分:5)

捕获组只能用于创建它的替换命令。这是学习sed的绝佳资源:http://www.grymoire.com/Unix/Sed.html

解决问题的更好方法是使用awk

awk -F: '{ OFS=$1; $1="" }1' file

结果:

1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f

说明:

-F标志将字段分隔符设置为冒号(-F:)。然后,对于每行输入,将输出字段分隔符设置为第一个字段(OFS="$1")并“删除”第一个字段(或者更确切地说将其设置为空; $1="")。最后的1启用默认打印。 HTH。

答案 1 :(得分:3)

你不能这样做,但还有另一种方法:

sed ':a;s/^\([0-9]*\):\([^:]*\):/\1:\2\1/;ta;s/://' input

说明

do {                                                           // a:
  1) match numbers at the beginning and a `:`                  // ^\([0-9]*\):
  2) match and remember everything that is not `:` upto an `:` // \([^:]*\):
  3) swap the `:` with the number from 1 (keep the first `:`)  // /\1:\2\1/
} while (there are matches)                                    // ta
finally delete the `:` after the number                        // s/://

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;s/^(([^:]*):.*):|:/\1\2/;ta' file