Terminal и Grepping Stderr: как запустить подробный код и найти стандартную ошибку, ничего не меняя?

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

template=$(cat << 'END_TEMPLATE'
I have some
text with ${placeholders}
in this and some ${different}
ones ${here} and ${there}
END_TEMPLATE
)

mapfile -t placeholders < <(grep -Po '(?<=\$\{).+?(?=\})' <<< "$template" | sort -u)

declare -A data
for key in "${placeholders[@]}"; do
    read -p "Enter the '$key' value: " -r data[$key]
done

t=$template
while [[ $t =~ '${'([[:alnum:]_]+)'}' ]]; do
    t=${t//"${BASH_REMATCH[0]}"/"${data[${BASH_REMATCH[1]}]}"}
    #      ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    #      |                    + the value the user entered
    #      + the placeholder in the text
done

echo "$t"
0
03.04.2020, 18:02
1 ответ

Я помещаю эти два варианта в качестве ответов, хотя они на самом деле не отвечают на вопрос (ответ "в bash, нет" )на случай, если кто-то увидит это, и чтобы показать метод замены stdout и stderr и правильное форматирование (в отличие от комментариев ).

Ответьте один :предположим, что это программа, которую вы хотите запустить (Я знаю, что это не похоже на команду, но притворяюсь, что это так; замените все на команду и аргументы, которые вы действительно хотите запустить):

{ echo stdout; echo stderr >&2; }

Теперь предположим, что вы хотите найти что-то только в stderr, но оставить stdout как есть -.

{ echo stdout; echo stderr >&2; } 2> >(grep something)

Если это все, что вы сделали, вы получите весь stdout и части stderr, в которых что-то есть, все вперемежку. Вы можете записать stdout и stderr в отдельные файлы для последующего просмотра :

.
{ echo stdout; echo stderr >&2; } 2> >(grep something > errorfile) > outputfile

Об обмене stdout и stderr (и о том, почему вы хотите это сделать ), см.https://stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderrдля лучшего объяснения, чем я могу дать.

0
28.04.2021, 23:18

Теги

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