Как прочитать входной файл строк, сопоставить и изменить совпадения в -месте?

Грамматика оболочки распознает слова присваивания на этапе лексирования , задолго до расширения параметров. Хотя у вас может быть параметр, расширяемый до команды , вы не можете расширять его до назначения — в этот момент он просто обрабатывается как команда, даже если он текстуально один и тот же (, это похоже на вас. написал"SLS_DEBUG=*" sls...).

Это странность синтаксического анализа и оценки языка команд оболочки. Определенные виды поведения определяются лексически при первом считывании кода, и эти поведения никогда не могут быть восстановлены позже, даже несмотря на то, что обычно кажется, что работает текстовая замена.

Вы можете использовать SLS_DEBUG_TEXT="eval SLS_DEBUG='*' ", и это будет работать, хотя и с потенциальными проблемами, если оставшаяся часть команды когда-либо может содержать какие-либо метасимволы оболочки. Другой вариант — вместо этого условно определить функцию :

.

sls_debug() { :; }
if [ "$ENABLE_DEBUG_LOGGING" = "true" ]; then
    sls_debug() {
        SLS_DEBUG='*' "$@"
    }
fi
sls_debug sls create_domain...

В качестве альтернативы (и, возможно, более понятной )функция, которая просто проверяет $ENABLE_DEBUG_LOGGINGвнутри, также будет работать, или env "$SLS_DEBUG_TEXT"...или eval "$SLS_DEBUG_TEXT"...также будут явными.

2
02.11.2021, 10:55
2 ответа

С помощью sedвы можете собрать имена файлов в резервном пространстве, а затем для всех строк в results.txtпроверить совпадения, чтобы отфильтровать, какие строки следует изменить:

sed -e '1,/^$/{H;1h;d;}' -e 'G;/^>\(.*\).*\n\1\n/s_^>_>h-19/US/CA-_;P;d' filename.txt <((echo)) results.txt
  • Вы видите, что я передаю пустую строку с <((echo))между файлами, поэтому 1,/^$/адресует все строки первого файла (и пустую строку)
  • Эти строки добавляются к пробелу, а затем удаляются с помощьюH;1h;d(1hпозволяет избежать запуска пробела с новой строки)
  • Gдобавляет пробел ко всем строкам result.txt, а /^>\(.*\).*\n\1\n/соответствует тем строкам, которые начинаются с >и строке, которая представляет собой имя файла (, заключенное в новые строки в пробеле)
  • s_^>_>h-19/US/CA-_заменяет эти строки
  • P;dпечатает только первую строку без добавленного мусора.Вы могли бы сделать s/\n.*//вместо
1
02.11.2021, 12:33

Используйте perlдля редактирования на месте во входном файле:

pfx='h-19/US/CA-' \
perl -pi -e '
  BEGIN { %h = map { tr/\n//dr => $ENV{pfx}} <STDIN>}
  s/^>\K(?=(.*))/$h{$1}/;
' results.txt < filename.txt
1
04.11.2021, 00:10

Теги

Похожие вопросы