![sed:删除除第一个字符串之外的所有出现的字符串](https://linux22.com/image/17105/sed%EF%BC%9A%E5%88%A0%E9%99%A4%E9%99%A4%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E5%87%BA%E7%8E%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有一个带有时间戳的日志文件。有时一行中会有多个时间戳。现在我想从一行中删除所有时间戳,但保留第一个时间戳。
我可以这样做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 字符。