在第二列之后查找并替换

find and replace after the second column

我有以下几行

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 大师,因为我正在努力增加我在这些语言方面的知识,欢迎您的帮助:)

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

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

将用 "newstring" 替换 Sof_。我不确定这就是您要找的东西。

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

你可以使用这个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

通过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

在 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     

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

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

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

这是使用 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) 和 removes/substitutes 文本。