在第二列之后查找并替换
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 文本。
我有以下几行
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 文本。