我有一个带有时间戳的日志文件。有时一行中有多个时间戳。现在我想从一行中删除所有时间戳,但保留第一个。
我可以这样做,s/pattern//2
但这只会删除第二次出现并且sed
不允许类似s/pattern//2-
.
有什么建议?
使用 GNU sed
:
sed 's/pattern//2g'
Run Code Online (Sandbox Code Playgroud)
在2
指定的第二图案和所有其余的g
应该删除。所以这将保留第一个。
这应该可以工作(如果它与您的日志冲突,请将 _ 替换为其他内容):
sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'
Run Code Online (Sandbox Code Playgroud)
sed -e ':begin;s/pattern//2;t begin'
Run Code Online (Sandbox Code Playgroud)
或者没有 sed goto:
sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//;s/pattern//g;H;g;s/\n.*\n//'
Run Code Online (Sandbox Code Playgroud)
从第 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//'
Run Code Online (Sandbox Code Playgroud)