Я пытаюсь итеративно искать и заменять строки в файле, используя переменную ввода и строку замены. Я пробовал использовать sed и awk и, похоже, определил, что на самом деле значение ассоциативного массива вызывает у меня проблемы (?).

Я смотрю на такой ассоциативный массив:

declare -A speedReplaceValuePairsText
speedReplaceValuePairsText["20"]="xthirtyx"
speedReplaceValuePairsText["30"]="xfiftyx"
speedReplaceValuePairsText["40"]="xsixtyx"
speedReplaceValuePairsText["50"]="xeightyx"
speedReplaceValuePairsText["60"]="xhundredx"

И для простоты я сначала объявлял свои заменяющие вары:

for speedBeforeValue in "${!speedReplaceValuePairsText[@]}";
do
    findValue=${speedBeforeValue}
    replaceWithValue=${speedReplaceValuePairsText[$speedBeforeValue]}
    #replaceWithValue="blah"
        
    echo "  Replacing $findValue with $replaceWithValue..."
        
    awk -v srch="$findValue" -v repl="$replaceWithValue" '{gsub(srch,repl); print}' infile.txt > outfile.txt

    #sed 's/'"$findValue"'/'"$replaceWithValue"'/g' infile.txt > outfile.txt
        
    #sed "s/$findValue/$replaceWithValue/g" $scriptDir/$currentFileName > outfile.txt
    done

Закомментированные строки - это альтернативные версии того, что я пробовал с аналогичными промежуточными версиями.

Я пробовал использовать обычную строку (закомментированное «бла»), и она отлично работает.

Самая странная часть заключается в том, что оператор echo отображает правильное значение как для ключа, так и для значения.

Я перепробовала столько комбинаций, что схожу с ума. Пожалуйста, скажите мне, что я здесь что-то делаю глупо.

ПРИМЕЧАНИЕ: это вложено в другой цикл, но я не считаю, что это проблема, дайте мне знать, если я ошибаюсь

РЕДАКТИРОВАТЬ: я упростил входящие и исходящие файлы, и, чтобы уточнить, если я попытаюсь использовать значение своего ассоциативного массива, ничего не будет заменено. Но если я использую фиктивную строку типа «бла», она работает.

БОНУС: Я отметил ответ ниже, но мои значения поиска и замены начинаются и заканчиваются в двойных кавычках, но независимо от того, что я пробую, он заменяет все экземпляры 60. Как я могу заставить его заменить «60» на «xsixtyx»?

Благодарность

0
ajloughr 1 Дек 2020 в 22:17

1 ответ

Лучший ответ

Я думаю, вы хотите использовать >> вместо > внутри своего цикла?

awk -v srch="$findValue" -v repl="$replaceWithValue" '{gsub(srch,repl); print}' $scriptDir/$currentFileName >> ./$outputFolderName/$currentFileName

Я попытался запустить ваш код, он работает, как ожидалось, за исключением того, что >.

Или, если вы просто хотите увидеть замененные результаты

awk -v srch="$findValue" -v repl="$replaceWithValue" '{ if (gsub(srch,repl))  print}' $scriptDir/$currentFileName >> ./$outputFolderName/$currentFileName

Для файла с

30
20
60

Вывод выглядит как

xthirtyx
xhundredx
xfiftyx

Для второго случая.

Вот полный сценарий bash, который я пробовал

    #!/bin/bash

    declare -A speedReplaceValuePairsText
    speedReplaceValuePairsText["20"]="xthirtyx"
    speedReplaceValuePairsText["30"]="xfiftyx"
    speedReplaceValuePairsText["40"]="xsixtyx"
    speedReplaceValuePairsText["50"]="xeightyx"
    speedReplaceValuePairsText["60"]="xhundredx"

    for speedBeforeValue in "${!speedReplaceValuePairsText[@]}";
    do
            findValue=${speedBeforeValue}
            replaceWithValue=${speedReplaceValuePairsText[$speedBeforeValue]}
            echo "  Replacing $findValue with $replaceWithValue..."

            awk -v srch="$findValue" -v repl="$replaceWithValue" '{if (gsub(srch,repl)) print}' test.txt  >> /tmp/test.txt
    done
2
CS Pei 1 Дек 2020 в 19:37