这问题是电报上群友问得,我跟进了一下,发现事情没有这么简单?
需求:某一个纯文本文件中,包含某关键词的行有若干,现在想把包含有这个关键词的"第一行"拎出来替换掉,如何实现呢?
最好是 oneliner?
1
neroxps Jul 15, 2022 sed 是逐行操作的,多行不合适。
perl 肯定可以,至于 oneliner 你也不放数据上来,让人凭空写? |
2
ysc3839 Jul 15, 2022 允许用 bash 吗?直接逐行遍历,用 bash 内置的正则匹配,匹配到了就替换,然后 break
|
3
wlsnx Jul 15, 2022 0,/kw/s/kw/xx/
0,/kw/把范围限制在第一次匹配的行之前(包括该行) |
4
zhanglintc Jul 15, 2022 @wlsnx #3 试了下,确实可以:
``` ➜ lane@vbox#2 ~ /usr/bin/cat file aaa bbb ccc aaa aaa aaa aaa ➜ lane@vbox#2 ~ /usr/bin/cat file | sed 0,/aaa/s/aaa/zzz/ zzz bbb ccc aaa aaa aaa aaa ``` |
5
Beebird Jul 15, 2022 只处理第一次出现<楼主 ID>的那一行,并且把<楼主 ID>都替换成小写:
sed '/7RTDKSAK/{s/7RTDKSAK/7rtdksak/g; :loop n; b loop}' <file> 3 楼的方法更清晰。 |
6
7RTDKSAK OP @neroxps 我的错,但是才发了帖发现 append 不了
@ysc3839 我拿 shell 过滤出了绝对行号再替换 @wlsnx 谢谢,找到过这个方案,但是没有理解这个 0,如果取其它值又是啥意思呢? @Beebird 我也是这个方案就搞到 loop 之前就不会了,谢谢! @zhanglintc 感谢! |
7
wlsnx Jul 15, 2022
0 是第一行的行号
|
8
wlsnx Jul 15, 2022
搞错了,1 才是第一行,这里写 1 也行,表示开始行号和结束行号
|
10
guanzhangzhang Jul 17, 2022 谷歌搜 sed quit after first match
|
11
7RTDKSAK OP @guanzhangzhang 好,谢谢!
|