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

Fol*_*den 19 sed

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

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

有什么建议?

αғs*_*нιη 9

使用 GNU sed

sed 's/pattern//2g'
Run Code Online (Sandbox Code Playgroud)

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

  • Cygwin 有(显然是一个端口)而 MacOS 没有。啊!这个解决方案更加优雅。 (2认同)

jll*_*gre 8

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

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要一个唯一的分隔符,请使用 `\n`。 (2认同)

jfg*_*956 6

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)