假设我有这个数据
1:a:b:c
2:d:e:f
3:a:b
4:a:b:c:d:e:f
我想要的输出是
1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f
我从这个问题中得到了
我正在尝试的解决方案是这个
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
捕获组只能在创建它的替换命令中使用。这是一个很好的学习资源:http sed
: //www.grymoire.com/Unix/Sed.html
解决您的问题的更好方法是使用awk
:
awk -F: '{ OFS=$1; $1="" }1' file
结果:
1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f
解释:
该-F
标志将字段分隔符设置为冒号 ( -F:
)。然后,对于每一行输入,将输出字段分隔符设置为第一个字段 ( OFS="$1"
) 并“删除”第一个字段(或者只是将其设置为 null; $1=""
)。最后1
,启用默认打印。HTH。
你不能那样做,但还有另一种方法:
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/://
这可能对您有用(GNU sed):
sed -r ':a;s/^(([^:]*):.*):|:/\1\2/;ta' file