我想用sed在第n次出现某些模式时执行替换,例如:
echo 'abcd
aZcd' | sed 's/./Z/3;s/Z.*//'
此代码的目的是删除3个字符后的字符。它适用于第一行,但不适用于第二行。输出是:
ab
a
如何解决这个问题?
期望的输出:
ab
aZ
答案 0 :(得分:3)
代码完全按预期工作,因为在第二个命令中,用空字符串替换Z
及其后的所有内容。在第二个输入行中,第二个位置有Z
,因此只剩下一个字符。要查看替换是否有效,您可以在其间添加l
命令:
$ echo 'abcd
aZcd' | sed 's/./Z/3;l;s/Z.*//'
abZd$
ab
aZZd$
a
要实际只保留三个字符,您可以
$ echo -e 'abcd \naZcd' | sed 's/.//3g'
ab
aZ
答案 1 :(得分:0)
这可能适合你(GNU sed):
sed 's/./\n/3;P;d' file
使用换行符作为标记,然后打印到标记并删除其余部分。
答案 2 :(得分:0)
sed 's/\(.\)\{3\}.*/\1/' YourFile
3
是您要保留的字符数。高256,由于sed缓冲区的限制,使用伪计数器。
伪计数器的samplke:1024 char是\(\(.\)\{256\}\)\{4\}\)