【问题标题】:find and replace after the second column在第二列之后查找并替换
【发布时间】:2015-05-07 00:44:16
【问题描述】:

我有以下几行

92520536843;Sof_voya_Faible_Email_am;EMAIL;28/01/2015;1;0;0;Sof_voya_Faible_Email_am;30/01/2015;Sof_voya_Faible_Email_Relance_am
92515196529;Sof_trav_Fort_Email_pm_%yyyy%mm%dd%;EMAIL;05/02/2015;1;0;0;Sof_trav_Fort_Email_pm_%yyyy%mm%dd%;09/02/2015;Export Trav_Fort Postal

我正在尝试在第 7 个字段之后替换 Sof__%yyyy%mm%dd% 之类的字符串。

我考虑过使用sed

sed -i 's/<string_to_look_for>/<string_to_replace>/7g' filename

但它只是改变了字段分隔符。

我想过用这个

awk -F";" '{ for (i=7; i<=NF; i++) print $i }' filename 

但我不知道如何为要替换的字符串插入搜索和替换。

欢迎任何帮助。

编辑:在第 7 列之后替换 Sof__%yyyy%mm%dd% 等字符串后的预期结果。

92520536843;Sof_voya_Faible_Email_am;EMAIL;28/01/2015;1;0;0;voya_Faible_Email_am;30/01/2015;voya_Faible_Email_Relance_am
92515196529;Sof_trav_Fort_Email_pm_%yyyy%mm%dd%;EMAIL;05/02/2015;1;0;0;trav_Fort_Email_pm;09/02/2015;Export Trav_Fort Postal

Python 和 Perl 大师,因为我正在努力提高我在这些语言方面的知识,欢迎您的帮助:)

【问题讨论】:

  • 你的预期输出是什么?
  • @anubhava : 好了
  • @AndyK 为什么第二个例子中的Sof_ 没有被替换?
  • @AvinashRaj 我的错。修改。
  • @AndyK perl 呢?

标签: python bash perl awk sed


【解决方案1】:

你可以使用这个awk:

awk 'BEGIN{FS=OFS=";"} {for (i=7;i<=NF;i++) gsub(/Sof_|_%yyyy%mm%dd%/, "", $i) } 1' file
92520536843;Sof_voya_Faible_Email_am;EMAIL;28/01/2015;1;0;0;voya_Faible_Email_am;30/01/2015;voya_Faible_Email_Relance_am
92515196529;Sof_trav_Fort_Email_pm_%yyyy%mm%dd%;EMAIL;05/02/2015;1;0;0;trav_Fort_Email_pm;09/02/2015;Export Trav_Fort Postal

【讨论】:

    【解决方案2】:

    通过python3。

    #!/usr/bin/python3
    import sys
    fil = sys.argv[1]
    with open(fil) as f:
        for line in f:
            part1 = ';'.join(line.split(';')[:7])
            part2 = ';'.join(line.split(';')[7:]).replace('Sof_','').replace('_%yyyy%mm%dd%', '')
            print(part1+';'+part2, end="")
    

    将上面的文本保存在一个文件中,比如script.py,然后运行它,

    python3 script.py inputfile
    

    通过 Perl。

    $ perl -pe 's/^(?:[^;]*;){7}(*SKIP)(*F)|(?:_%yyyy%mm%dd%|Sof_)//g' file
    92520536843;Sof_voya_Faible_Email_am;EMAIL;28/01/2015;1;0;0;voya_Faible_Email_am;30/01/2015;voya_Faible_Email_Relance_am
    92515196529;Sof_trav_Fort_Email_pm_%yyyy%mm%dd%;EMAIL;05/02/2015;1;0;0;trav_Fort_Email_pm;09/02/2015;Export Trav_Fort Postal
    

    【讨论】:

      【解决方案3】:

      在 Python 中,您将使用 re 和 csv 模块来执行此操作:

      import re
      import csv
      
      with open(fn) as fin:
          r=csv.reader(fin, delimiter=';')
          for line in r:
              result=line[:7]
              for field in line[:7]:
                  if re.search(r'Sof_', field):
                      field=re.sub(r'Sof_', 'repalcaement for Sof_', field)
                  if re.search(r'_%yyyy%mm%dd%', field):
                      field=re.sub(r'Sof_', 'repalcaement for _%yyyy%mm%dd%', field)
                  result.append(field)   
              print result     
      

      【讨论】:

        【解决方案4】:

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

        sed -r ':a;s/^(([^;]*;){7}.*)(Sof_|_%yyyy%mm%dd%)/\1/;ta' file
        

        这会在第一个反向引用中存储前七个字段和后续字符串(与所需字符串不匹配),然后用所述反向引用替换所需字符串。

        【讨论】:

          【解决方案5】:

          假设您想要输入文件中的 while 行,请注意:这从字段 #7 开始。您的数据存在于每一行的前面。

          awk -F";" '{ for (i=7; i<=NF; i++) 
             {gsub(/Sof_/,"newstring", ($i) } ; 
              print $0} ' filename 
          

          将 Sof_ 替换为“newstring”。我不确定这就是你要找的东西。

          正确的语法错误 - 删除了 erratn ' 字符 - 谢谢

          【讨论】:

          • 确实是我想要的。让我看看。
          • 第一个是这个-bash: syntax error near unexpected token ('`
          • 将脚本修改为这个awk -F";" '{ for (i=7; i&lt;=NF; i++) {$(i)=gsub(/Sof_/,"newstring", ($i) } }; print $0 ' filename后,运行时出现这个错误awk: cmd. line:1: ^ syntax error
          • 谢谢 - 抱歉打错了。
          • 刚刚测试过,做了一处改动。对不起
          【解决方案6】:

          这是使用 perl 的 -F -a and autosplit 的另一种方式:

          perl -F";" -anE 'for ( @F[7..$#F] ) { $_ =~ s/Sof_|_%yyyy%mm%dd%//g } 
                    print join ";", @F;' file.txt
          

          这会抓取自动创建的 @F 数组的第 7 个元素($#F)并删除/替换文本。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-12
            • 1970-01-01
            • 2017-12-19
            • 2019-01-04
            • 2021-07-28
            • 2018-11-16
            • 2021-12-18
            相关资源
            最近更新 更多