Передать вывод всех интерактивных команд в less?

Стандартный синтаксис для команды a::

sed -e 'a\
first line\
  second line\
last line'

BSD (по крайней мере, FreeBSD и OS/X)sedудаляют начальные пробелы , а требуется -eдля устранения ошибки . GNU sedпозволяет переместить первую строку сразу после a\, если она не -пуста.

Итак, вам нужно предварительно обработать ввод:

VAR='content with
multiple lines
  some with lead blanks
or even backslash\'

preprocessed_VAR=$(printf '%s\n' "$VAR" |
  sed 's/\\/&&/g;s/^[[:blank:]]/\\&/;s/$/\\/')

sed -i -e "/MatchingPattern/a\\
${preprocessed_VAR%?}" somefile

(замените -iна -i ''во FreeBSD или OS/X ).

В GNU/Linux и с оболочкой GNU(bash)или zshвы можете вместо этого:

sed -i '/MatchingPattern/r /dev/stdin' <<< "$VAR"

Это работает, потому что bashи zshреализуют здесь -строки с удаленными временными файлами, а /dev/stdin в Linux реализован как символическая ссылка на файл (, что означает, что его можно открыть несколько раз, и каждый раз он открыт в начале ).

Здесь вы также можете использовать GNU awkвместо:

(export VAR
gawk -i inplace '{print}; /MatchingPattern/{print ENVIRON["VAR"]}' somefile)

Илиperl(откуда это -iисходит):

(export VAR
perl -pi -e '$_.= "$ENV{VAR}\n" if /MatchingPattern/' somefile)

0
05.09.2020, 10:33
1 ответ

Для этого можно создать функцию, подобную следующей:

less_all_commands(){
  while read -ra c;do 
    "${c[@]}"|less; 
  done; 
}

Выполнив эту функцию, все ваши команды будут переданы в less.
Выйдите из этой функции (Ctrl + C), вы вернетесь в свою обычную среду оболочки.

1
18.03.2021, 23:07

Теги

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