【问题标题】:Sed or awk - need to grab a substring and append it to the end of the linesed 或 awk - 需要抓取一个子字符串并将其附加到行尾
【发布时间】:2012-12-09 11:46:10
【问题描述】:

我使用的是 Windows sed / awk 但 unix 命令类似,

文件1

\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15

需要的输出:

\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/BU/MICROSOFT MACRO REMEDIATION

我需要抓取第一个字段,例如在第 4 次出现 backslack 之后抓取字符串:

\\FILE44\FILE44\BU\EARPS\FUNDCHECK

它将是 \BU\EARPS\FUNDCHECK,然后将反斜杠转换为斜杠:/BU/EARPS/FUNDCHECK 然后将其附加到该行的末尾。

\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK

【问题讨论】:

    标签: windows text sed awk substring


    【解决方案1】:

    这是使用awk的一种方式:

    awk -F ";" '{ a = $0; sub(/^\\\\[^\\]*\\[^\\]*/,""); gsub(/\\/,"/",$1); print a $1 }' file
    

    或者简化正则表达式:

    awk -F ";" '{ a = $0; sub(/^\\(\\[^\\]*){2}/,""); gsub(/\\/,"/",$1); print a $1 }' file
    

    结果:

    \\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
    \\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK
    \\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/BU/MICROSOFT MACRO REMEDIATION
    

    【讨论】:

      【解决方案2】:

      这种单线可能会起作用:

       awk -F';' '{x=$1;sub(/\\\\[^\\]+\\[^\\]+\\/,"",x);gsub(/\\/,"/",x);print $0"/"x}' file
      

      测试

      kent$  awk -F';' '{x=$1;sub(/\\\\[^\\]+\\[^\\]+\\/,"",x);gsub(/\\/,"/",x);print $0"/"x}' test
      \\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
      \\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK
      \\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/BU/MICROSOFT MACRO REMEDIATION
      

      【讨论】:

        【解决方案3】:

        使用 sed:

        sed -e 's/\(\([^\\]*\\\)\{4\}\)\([^;]*\);\(.*\)/\1\3;\4\/\3/' 
            -e ':l s/\([^;]*;[^;]*;[^\\]*\)\\/\1\//;t l' input
        

        【讨论】:

          【解决方案4】:

          这可能对你有用(GNU sed):

          sed -r 'h;s/^(([\\][^\\]*){3})([^;]*).*/\3/;y/\\/\//;H;g;s/\n//' file
          
          • h将原行复制到保持空间(HS)
          • s/^(([\\][^\\]*){3})([^;]*).*/\3/ 隔离有问题的字符串
          • y/\\/\//\ 替换为 /
          • H 将修改后的字符串追加到 HS 中的原始行(引入换行符)
          • g将修改后的行检索到模式空间(PS)
          • s/\n//删除换行符

          【讨论】:

            【解决方案5】:
            awk -F";" '{n=split($1,a,"\\");$0=$0"/"a[n];print $0}' your_file
            

            测试如下:

             cat temp
            \\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage
            \\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44
            \\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15
            
            > awk -F";" '{n=split($1,a,"\\");$0=$0"/"a[n];print $0}' temp
            \\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
            \\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/FUNDCHECK
            \\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/MICROSOFT MACRO REMEDIATION
            >
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-14
              • 1970-01-01
              • 2018-07-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多