V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
maxduke
V2EX  ›  问与答

Linux BASH 文本处理求助

  •  
  •   maxduke · 2018-11-17 17:38:35 +08:00 · 1286 次点击
    这是一个创建于 1980 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有以下源文件 a.txt:

    # This is a file
    // Comments
    somechars
    somechars,somechar
    somechars,somechars,somechars

    需求:
    在有且只有一个逗号的情况下,在行末插入指定字符串。 在有 2 个逗号的情况下,在第二个逗号前插入指定字符串。

    输出效果 output.txt:

    # This is a file
    // Comments
    somechars
    somechars,somechar,STRTOBEINSERT
    somechars,somechars,STRTOBEINSERT,somechars


    求教如何实现这个效果,使用 sed/awk 都可以,多谢🙏
    6 条回复    2018-11-17 19:56:58 +08:00
    ifaii
        1
    ifaii  
       2018-11-17 19:07:02 +08:00
    x='|STRTOBEINSERT|'
    perl -pe "s/(.*?)(,)(.*?)(,)(.*$)/\1\2\3$x\4\5/g || s/(.*?)(,)(.*$)/\1$x\2\3/g" filename

    我又复习了一次 perl 的用法
    ifaii
        2
    ifaii  
       2018-11-17 19:09:32 +08:00   ❤️ 1
    看错题目了,稍微改一下参数位置即可

    x='|STRTOBEINSERT|'

    perl -pe "s/(.*?)(,)(.*?)(,)(.*$)/\1\2\3$x\4\5/g || s/(.*?)(,)(.*$)/\1\2\3$x/g" filename
    l76862157
        3
    l76862157  
       2018-11-17 19:29:31 +08:00   ❤️ 1
    awk -F',' '{if(NF==2){print $0", STRTOBEINSERT"} else if(NF==3){print $1","$2", STRTOBEINSERT,"$3}else{print}}'
    DiamondbacK
        4
    DiamondbacK  
       2018-11-17 19:31:02 +08:00   ❤️ 1
    sed 's/[^,]*,[^,]*/&,STRTOBEINSERT/'
    gawk 'NF>1 {$2=$2 ",STRTOBEINSERT"} {print}' FS=, OFS=,
    uuspider
        5
    uuspider  
       2018-11-17 19:31:26 +08:00   ❤️ 2
    sed 's/\([^,]*,[^,]*\)\(.*\)/\1,STRTOBEINSERT\2/'
    maxduke
        6
    maxduke  
    OP
       2018-11-17 19:56:58 +08:00
    以上各位回复都感谢啦,🙏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2703 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:06 · PVG 23:06 · LAX 08:06 · JFK 11:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.