【问题标题】:sed - find text between 2 strings and use it for replacesed - 查找 2 个字符串之间的文本并将其用于替换
【发布时间】:2013-07-26 09:05:34
【问题描述】:

我有一个包含许多行的文件,如下所示:

townValue.put("Aachen");    
townValue.put("Aalen");             
townValue.put("Ahlen");             
townValue.put("Arnsberg");          
townValue.put("Aschaffenburg");         
townValue.put("Augsburg");

我想把这行改成:

townValue.put("Aalen", "Aalen");            
townValue.put("Ahlen", "Ahlen");            
townValue.put("Arnsberg", "Arnsberg");          
townValue.put("Aschaffenburg", "Aschaffenburg");        
townValue.put("Augsburg", "Augsburg");

如何使用 sed 或 awk 实现这一点。这似乎是一个特殊的查找和替换任务,我在网上还找不到。

感谢您的帮助

【问题讨论】:

    标签: unix replace sed awk


    【解决方案1】:

    使用sed -e 's/"[^"]*"/&, &/':

    $ cat 1
    townValue.put("Aachen");    
    townValue.put("Aalen");             
    townValue.put("Ahlen");             
    townValue.put("Arnsberg");          
    townValue.put("Aschaffenburg");         
    townValue.put("Augsburg");
    $ sed -e 's/"[^"]*"/&, &/' 1
    townValue.put("Aachen", "Aachen");    
    townValue.put("Aalen", "Aalen");             
    townValue.put("Ahlen", "Ahlen");             
    townValue.put("Arnsberg", "Arnsberg");          
    townValue.put("Aschaffenburg", "Aschaffenburg");         
    townValue.put("Augsburg", "Augsburg");
    

    根据 sed(1):

    s/正则表达式/替换/

    尝试将正则表达式与模式空间进行匹配。如果成功,则替换与替换匹配的部分。替换可能包含特殊字符 & 来表示匹配的模式空间部分,特殊转义符 \1 到 \9 表示正则表达式中相应的匹配子表达式。

    【讨论】:

    • ".*" 足以解决这个问题。使用[^"],看起来更好,但如果真的有更多对",这也不起作用,它只会替换第一个"...",谁知道第一个是否是OP想要替换的那个。 :)
    【解决方案2】:

    的代码,由于命令行中有大量引号,我建议使用脚本:

    awk -f script file
    
    • 脚本

      BEGIN {FS=OFS="\""}
      $3=", \""$2"\""$3
      

    $猫文件 townValue.put("亚琛"); townValue.put("阿伦"); townValue.put("阿伦"); townValue.put("Arnsberg"); townValue.put("阿沙芬堡"); townValue.put("奥格斯堡"); $ awk -f 脚本文件 townValue.put("亚琛", "亚琛"); townValue.put("阿伦", "阿伦"); townValue.put("阿伦", "阿伦"); townValue.put("Arnsberg", "Arnsberg"); townValue.put("阿沙芬堡", "阿沙芬堡"); townValue.put("奥格斯堡", "奥格斯堡");

    【讨论】:

    • 不幸的是,它对我不起作用。我明白了:townValue.put("Aachen"); , ""
    • @codyLine 这对我有用。但是命令行中有很多双引号,这里最好使用一个很小的脚本文件。我进行了编辑。
    • 我再次尝试使用脚本,结果如​​下:~$ awk -F" -v OFS=" -f awk-script townList.txt townValue.put("Aachen"); , "" townValue.put("Aalen"); , "" townValue.put("Ahlen"); , "" townValue.put("Arnsberg"); , "" :-(
    • 我使用的是 Kubuntu 13.04
    • @codyLine 我无法用 Kubuntu 测试它。我在脚本中移动了-F" -v OFS=",请查看。如果这不起作用,请检查awk --version,当前是 4.1.0
    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2018-02-16
    • 2019-07-13
    • 2018-08-29
    • 2014-09-05
    • 2022-12-29
    • 2018-02-14
    相关资源
    最近更新 更多