V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
7RTDKSAK
V2EX  ›  Linux

sed/perl 正则表达式请教?

  •  
  •   7RTDKSAK · 2022-07-15 16:50:10 +08:00 · 1614 次点击
    这是一个创建于 643 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    最好是 oneliner?

    11 条回复    2022-08-03 22:49:31 +08:00
    neroxps
        1
    neroxps  
       2022-07-15 17:07:09 +08:00   ❤️ 1
    sed 是逐行操作的,多行不合适。
    perl 肯定可以,至于 oneliner 你也不放数据上来,让人凭空写?
    ysc3839
        2
    ysc3839  
       2022-07-15 18:29:38 +08:00   ❤️ 1
    允许用 bash 吗?直接逐行遍历,用 bash 内置的正则匹配,匹配到了就替换,然后 break
    wlsnx
        3
    wlsnx  
       2022-07-15 18:34:18 +08:00   ❤️ 3
    0,/kw/s/kw/xx/
    0,/kw/把范围限制在第一次匹配的行之前(包括该行)
    zhanglintc
        4
    zhanglintc  
       2022-07-15 20:41:14 +08:00   ❤️ 1
    @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
        5
    Beebird  
       2022-07-15 20:52:41 +08:00   ❤️ 1
    只处理第一次出现<楼主 ID>的那一行,并且把<楼主 ID>都替换成小写:

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

    3 楼的方法更清晰。
    7RTDKSAK
        6
    7RTDKSAK  
    OP
       2022-07-15 21:23:20 +08:00
    @neroxps 我的错,但是才发了帖发现 append 不了

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

    @Beebird 我也是这个方案就搞到 loop 之前就不会了,谢谢!
    @zhanglintc 感谢!
    wlsnx
        7
    wlsnx  
       2022-07-15 21:32:36 +08:00
    0 是第一行的行号
    wlsnx
        8
    wlsnx  
       2022-07-15 21:37:59 +08:00
    搞错了,1 才是第一行,这里写 1 也行,表示开始行号和结束行号
    7RTDKSAK
        9
    7RTDKSAK  
    OP
       2022-07-15 21:39:55 +08:00
    @wlsnx 谢谢!我再试试!
    guanzhangzhang
        10
    guanzhangzhang  
       2022-07-17 22:01:07 +08:00   ❤️ 1
    谷歌搜 sed quit after first match
    7RTDKSAK
        11
    7RTDKSAK  
    OP
       2022-08-03 22:49:31 +08:00
    @guanzhangzhang 好,谢谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1408 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:51 · PVG 07:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.