在第二列之后找到并替换

时间:2015-03-05 15:20:53

标签: python bash perl awk sed

我有以下几行

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 大师,因为我试图提高我对这些语言的知识,欢迎您的帮助:)

6 个答案:

答案 0 :(得分:2)

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

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

将用&#34; newstring&#34;替换Sof_。我不肯定这就是你要找的东西。

正确的语法错误 - 删除错误&#39;性格 - 谢谢

答案 1 :(得分:2)

您可以使用此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 :(得分: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 :(得分:2)

在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 :(得分:2)

这可能适合你(GNU sed):

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

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

答案 5 :(得分:1)

以下是使用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)并删除/替换文本。