sed/perl 正则表达式请教?

2022 年 7 月 15 日
 7RTDKSAK

这问题是电报上群友问得,我跟进了一下,发现事情没有这么简单?

需求:某一个纯文本文件中,包含某关键词的行有若干,现在想把包含有这个关键词的"第一行"拎出来替换掉,如何实现呢?

最好是 oneliner?

2711 次点击
所在节点    Linux
11 条回复
neroxps
2022 年 7 月 15 日
sed 是逐行操作的,多行不合适。
perl 肯定可以,至于 oneliner 你也不放数据上来,让人凭空写?
ysc3839
2022 年 7 月 15 日
允许用 bash 吗?直接逐行遍历,用 bash 内置的正则匹配,匹配到了就替换,然后 break
wlsnx
2022 年 7 月 15 日
0,/kw/s/kw/xx/
0,/kw/把范围限制在第一次匹配的行之前(包括该行)
zhanglintc
2022 年 7 月 15 日
@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
```
Beebird
2022 年 7 月 15 日
只处理第一次出现<楼主 ID>的那一行,并且把<楼主 ID>都替换成小写:

sed '/7RTDKSAK/{s/7RTDKSAK/7rtdksak/g; :loop n; b loop}' <file>

3 楼的方法更清晰。
7RTDKSAK
2022 年 7 月 15 日
@neroxps 我的错,但是才发了帖发现 append 不了

@ysc3839 我拿 shell 过滤出了绝对行号再替换
@wlsnx 谢谢,找到过这个方案,但是没有理解这个 0,如果取其它值又是啥意思呢?

@Beebird 我也是这个方案就搞到 loop 之前就不会了,谢谢!
@zhanglintc 感谢!
wlsnx
2022 年 7 月 15 日
0 是第一行的行号
wlsnx
2022 年 7 月 15 日
搞错了,1 才是第一行,这里写 1 也行,表示开始行号和结束行号
7RTDKSAK
2022 年 7 月 15 日
@wlsnx 谢谢!我再试试!
guanzhangzhang
2022 年 7 月 17 日
谷歌搜 sed quit after first match
7RTDKSAK
2022 年 8 月 3 日
@guanzhangzhang 好,谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/866470

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX