第n次发生的操作

时间:2014-06-01 16:32:53

标签: sed

我想用sed在第n次出现某些模式时执行替换,例如:

echo 'abcd
aZcd' | sed 's/./Z/3;s/Z.*//'

此代码的目的是删除3个字符后的字符。它适用于第一行,但不适用于第二行。输出是:

ab
a

如何解决这个问题?

期望的输出:

ab
aZ

3 个答案:

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