AWK用带下划线的相同字符串替换字符串

时间:2015-10-27 16:43:34

标签: regex awk

我有三个文件。一个是原始文件,另一个包含原始行的一部分,另一个文件与修改过的部分必须替换原始文件。 甚至不知道从哪里开始。你能救我吗?

匹配文件:

a demandé de montrer
grandes vacances
de faire
a montré
a remis
bien posé
n '
quand il l '
arrière du véhicule
modèle essence

替换文件:

a_demandé_de_montrer
grandes_vacances
de_faire
a_montré
a_remis
bien_posé
n_'
quand_il_l_'
arrière_du_véhicule
modèle_essence

原始文件:

A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes vacances on m'a demandé de montrer le bon.
A chacun son choix
A chaque fois c'est moi qui dois les recontacter.
A eux de faire leurs avis....
A l'achat, le vendeur m'a montré comment rabattre le siège arrière, mais quand il l'a remis en place, ce n'était pas bien posé.
A l'arrière du véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.

期望的输出:

A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes vacances on m'a_demandé_de_montrer le bon.
A chacun son choix
J'avais droit aux grandes_vacances à l'entretien kit vacances.
A chaque fois c'est moi qui dois les recontacter.
A eux de_faire leurs avis....
A l'achat, le vendeur m'a_montré comment rabattre le siège arrière, mais quand il l'a_remis en place, ce n'était pas **bien_posé**.
A l'arrière_du_véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle_essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.

5 个答案:

答案 0 :(得分:1)

您没有表现出任何有关实施的努力,但这可以解决您的问题。

awk -F"\t" 'NR==FNR{a[$1]=$2;next} 
                   {for(k in a) gsub(k,a[k])}1' <(paste search replace) text

创建一个查找表,根据查找进行替换。

答案 1 :(得分:1)

可能有更好的方法可以做到这一点,但是如果你想使用AWK,你可以为你读取的每个文件设置一个变量,使用find和replace字符串构建一些数组,然后循环遍历每个find /替换值:

awk '
  file == 1 { source[++s] = $0 }
  file == 2 { replace[++r] = $0 }
  file == 3 {
    for (i = 1; i < s; i++)
      { gsub (source[i], replace[i], $0)  }
    print
  }
' file=1 match_file \
  file=2 replace_file \
  file=3 original_file

我并不是说这是最有效的方法,但我认为它会按照您的描述进行。

答案 2 :(得分:1)

以下是使用awk解决此问题的一种方法:

#!/usr/bin/awk -f
FILENAME == ARGV[1] { m[FNR]=$0 } # Store the match word in an array
FILENAME == ARGV[2] { r[FNR]=$0 } # Store the replacement word in a second array
FILENAME == ARGV[3] { for (i in m) gsub(m[i],r[i]); print } # Do the replacement for every line in file3

像这样运行:

./script.awk match_file replace_file original_file

答案 3 :(得分:0)

这是输出前三个代码。这是前两个代码的输出。也许编码?

a_demand▒_de_montreraa_demand▒_de_montreria_demand▒_de_montrersa_demand▒_de_montrersa_demand▒_de_montreroa_demand▒_de_montrerna_demand▒_de_montrersa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montrerea_demand▒_de_montrerua_demand▒_de_montrerra_demand▒_de_montrer a_demand▒_de_montrerua_demand▒_de_montrerna_demand▒_de_montrer a_demand▒_de_montrerta_demand▒_de_montrerea_demand▒_de_montrerma_demand▒_de_montrerpa_demand▒_de_montrersa_demand▒_de_montrer a_demand▒_de_montrerda_demand▒_de_montrer a_demand▒_de_montreraa_demand▒_de_montrerda_demand▒_de_montreraa_demand▒_de_montrerpa_demand▒_de_montrerta_demand▒_de_montreraa_demand▒_de_montrerta_deman
d▒_de_montreria_demand▒_de_montreroa_demand▒_de_montrerna_demand▒_de_montrer a_demand▒_de_montrer.a_demand▒_de_montrer.a_demand▒_de_montrer.a_demand▒_de_montrer
a_demand▒_de_montrerAa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montreraa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montreria_demand▒_de_montrerma_demand▒_de_montreria_demand▒_de_montrerta_demand▒_de_montrerea_demand▒_de_montrer,a_demand▒_de_montrer a_demand▒_de_montrerca_demand▒_de_montrerha_demand▒_de_montreraa_demand▒_de_montrerca_demand▒_de_montrerua_demand▒_de_montrerna_demand▒

我试过这个..     

    BEGIN {
    while ((getline ln1 < mt) > 0)
    {
        source[++s] = ln1;
    }
    while ((getline ln2 < rp) > 0)
    {
        replace[++r] = ln2;
    }
    }
    {
    for ( i = 1; i < s; i++)
        gsub (source[i], replace[i], $0)
        print;
    }
    

答案 4 :(得分:0)

使用GNU awk for ARGIND(其他awks只需添加FNR==1{ARGIND++}):

$ cat tst.awk
ARGIND==1 { a[FNR] = $0; next }
ARGIND==2 { map[a[FNR]] = $0; next }
{
    for (m in map) {
        gsub(m,map[m])
    }
    print
}

$ awk -f tst.awk match.txt replace.txt original.txt
A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes_vacances on m'a_demandé_de_montrer le bon.
A chacun son choix
A chaque fois c'est moi qui dois les recontacter.
A eux de_faire leurs avis....
A l'achat, le vendeur m'a_montré comment rabattre le siège arrière, mais quand il l'a_remis en place, ce n'était pas bien_posé.
A l'arrière_du_véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle_essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.

与目前发布的所有其他解决方案一样,如果您的匹配文件中有正则表达式元字符或替换文件中的正则表达式捕获组标识符,则上述操作会表现不佳。如果发生这种情况,请使用index()substr()代替gsub()