Suponho que você queira substituir todas as ocorrências de qualquer palavra em sua matriz arr
pela palavra ANON
.
Seu código funciona muito bem, mas você sobrescreve o arquivo de saída para cada iteração do loop, o que significa que o arquivo final terá apenas a última palavra da matriz substituída.
Também há um possível problema se alguma das palavras contiver caracteres que possam ser interpretados como caracteres de expressão regular, como *
e [
, por exemplo.
Seria mais seguro fazer uma comparação exata de string para cada substituição. Você pode fazer isso com awk
:
{
while (offset = index($0, str))
$0 = substr($0, 1, offset - 1) "ANON" substr($0, offset + length(str))
}
{ print }
Isso substituirá todas as ocorrências do valor de str
pela string ANON
, mesmo que str
contenha caracteres de expressão regular.
Para ler as strings de um arquivo (com o bônus adicional de que a segunda coluna do arquivo de string delimitado por tabulação contém a string a ser substituída):
BEGIN { FS = "\t" }
NR == FNR { str[$1] = $2; next }
{
for (s in str) {
sl = length(s)
while (offset = index($0, s))
$0 = substr($0, 1, offset - 1) str[s] substr($0, offset + sl)
}
}
{ print }
Dado o arquivo de strings delimitado por tabulação strings
as
*password* *redacted*
My Name Not really my name
... e o arquivo de texto file.txt
as
Password for the account belonging to My Name: *password*
... o código awk produziria
Password for the account belonging to Not really my name: *redacted*
quando executado como
awk -f script.awk strings file.txt