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

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

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

我可以这样做s/pattern//2,但这只会删除第二次出现,并且sed不允许类似s/pattern//2-.

有什么建议么?

答案1

使用 GNU sed

sed 's/pattern//2g'

指定应删除2第二个模式和所有其余模式g。所以这将保留第一个。

答案2

这应该可以工作(如果与您的日志冲突,请将 _ 替换为其他内容):

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

答案3

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//'

答案4

@jillagre 的答案略有不同(为了鲁棒性而修改)可能看起来像:

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

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

相关内容