我有以下几行
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 大师,因为我试图提高我对这些语言的知识,欢迎您的帮助:)
答案 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
)并删除/替换文本。