我有一个带有时间戳的日志文件。有时一行中会有多个时间戳。现在我想从一行中删除所有时间戳,但保留第一个时间戳。
我可以这样做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///
为文字\n
ewline 字符。