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

V 友们,请教个提取两个字符串中的语句并加引号的 sed 写法

  •  
  •   maosu · 2022-11-03 23:30:12 +08:00 · 1973 次点击
    这是一个创建于 529 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举个栗子:
    howdareyou

    我想提取出 dare 这个单词并给这个单词两边加上单引号,如下
    how'dare'you

    最近在自学 sed 的正则表达式,实在搞不定,来请教一下万能的 V 友,谢谢啦~

    很抱歉之前表述不太清楚,实际需求是 how 和 you 之间的语句是不确定的,需要提取这个不确定的语句并加上引号哈
    9 条回复    2022-11-05 17:48:04 +08:00
    wxf666
        1
    wxf666  
       2022-11-03 23:32:50 +08:00
    ```shell
    $ sed "s/dare/'&'/" <<<'howdareyou'
    how'dare'you
    ```
    iamzuoxinyu
        2
    iamzuoxinyu  
       2022-11-04 00:10:16 +08:00
    一个快但可能不正确的方法:给 how 和 you 改成 how' 和 'you
    yuanmomo
        3
    yuanmomo  
       2022-11-04 03:28:43 +08:00 via iPhone
    @iamzuoxinyu 跟你想到一块儿了
    dcsuibian
        4
    dcsuibian  
       2022-11-04 03:54:06 +08:00
    sed 的正则表达式引擎比较弱
    建议用 awk ,有扩展的正则表达式引擎。

    其中对应你这个问题就是 group 分组和引用功能
    aijam
        5
    aijam  
       2022-11-04 07:50:06 +08:00   ❤️ 1
    > echo howdareyou | sed -r "s/how(.+)you/how'\1'you/"
    how'dare'you
    huntagain2008
        6
    huntagain2008  
       2022-11-04 08:57:58 +08:00   ❤️ 1
    #5 /how(.+)you/ 可能用的是“.“,跟用字母[a-zA-Z]匹配的结果完全不同 。当字符串很长,中间有一些干扰项,比如前面中间都有 how 、you ,结尾是 you ,中间明明是可以匹配好几个 how*****you 的,但是只匹配了第一个 how 和最后一个 you ,中间的各种 how****you 都没有打上引号,只给第一个 how 和最后一个 you 打了引号。
    maosu
        7
    maosu  
    OP
       2022-11-04 09:12:37 +08:00
    @aijam
    @huntagain2008
    感谢感谢,两位写的都很好哈,我也发现了这个问题,/how(.+)you/只给头尾匹配的 how you 前加上了引号,还不太清楚怎么处理哈
    huntagain2008
        8
    huntagain2008  
       2022-11-04 09:22:53 +08:00
    #2 how->how‘ you->‘you 这种还清楚点,小白我就是这样想的。

    awk 有内置的 gsub 函数可以全局替换匹配项

    # howxxxyou.awk
    #
    {
    value = $0
    gsub(/how/, "&'", value)
    gsub(/you/, "'&", value)
    print value
    }
    aloxaf
        9
    aloxaf  
       2022-11-05 17:48:04 +08:00
    @maosu #7 sed 不支持非贪婪,用 perl 吧

    ❯ echo howareyouhowareyou | perl -pe "s/how(.+?)you/how'\1'you/g"
    how'are'youhow'are'you
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5513 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:23 · PVG 16:23 · LAX 01:23 · JFK 04:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.