sed:删除除第一个字符串外的所有出现的字符串


14

我有一个带有时间戳的日志文件。有时一行中有多个时间戳。现在,我想从一行中删除所有时间戳,但保留第一个。

我可以,s/pattern//2但是只能删除第二次出现,sed并且不允许类似的操作s/pattern//2-

有什么建议么?


我应该告诉我这是busybox的问题。抱歉
Folkert van Heusden

Answers:


4

使用GNU sed

sed 's/pattern//2g'

2指定的第二图案和所有其余的g应该删除。因此,这将保留第一个。


1
Cygwin拥有(显然是)的端口,而MacOS没有。阿赫!这个解决方案非常优雅。
r_alex_hall

7

这应该可以工作(如果_与日志冲突,请用_代替):

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'

1
如果您需要唯一的定界符,请使用\n
mikeserv

5
sed -e ':begin;s/pattern//2;t begin'

或不使用sed goto:

sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//;s/pattern//g;H;g;s/\n.*\n//'

从第n个(例如3个)位置删除的通用解决方案是:

sed -e ':begin;s/pattern//4;t begin'
sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//3;s/pattern//g;H;g;s/\n.*\n//'

1

@jillagre的答案略有变化(针对健壮性进行了修改)可能类似于:

sed 's/p\(attern\)/p\n\1/;s///g;s/\n//'

...但是在某些情况下,sed您可能需要n将第一个s///ubstitution语句右侧的替换为原义的\newline字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.