Я предполагаю, что вы хотите заменить все вхождения любого слова в вашем массиве arr
словом ANON
.
Ваш код работает отлично, но вы перезаписываете выходной файл для каждой итерации цикла, а это означает, что в конечном файле будет заменено только последнее слово в массиве.
Также существует потенциальная проблема, если какое-либо из слов содержит символы, которые могут быть интерпретированы как символы регулярного выражения, например *
и [
.
Было бы безопаснее проводить точное сравнение строк для каждой замены. Вы можете сделать это с помощьюawk
:
{
while (offset = index($0, str))
$0 = substr($0, 1, offset - 1) "ANON" substr($0, offset + length(str))
}
{ print }
Это заменит все вхождения значения str
строкой ANON
, даже если str
содержит символы регулярного выражения.
Чтение строк из файла (с дополнительным бонусом, заключающимся в том, что второй столбец файла строк с разделителями табуляции -содержит строку для замены на):
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 }
Учитывая вкладку -строки с разделителями strings
как
*password* *redacted*
My Name Not really my name
... и текстовый файл file.txt
как
Password for the account belonging to My Name: *password*
... код awk выдаст
Password for the account belonging to Not really my name: *redacted*
при запуске как
awk -f script.awk strings file.txt
Я вижу, как сбивают с толку инструкции; вам нужно ввести
+20G
в подсказке, а не +size...
.
В примере, который вы публикуете, синтаксис размера неверен, вы должны опустить слово «размер», размер, который вы должны ввести, это :+20G