Поместить совпавшую строку с expr1 перед другой совпавшей строкой с expr2 выше в файле, содержащем несколько expr2

Операторы [[и ]]предназначены для явных сравнительных тестов. Если вы хотите проверить два результата команды , просто используйте оболочку:

$ if /usr/bin/pgrep -fq "/home/tiger/bin/pymp" || /usr/bin/pgrep -fq "/usr/bin/mpv2" ; then do_stuff; fi

Не все версии pgrepподдерживают аргумент -qдля подавления вывода. Если это ваш случай, вы можете подавить каждое pgrepпо отдельности или комбинировать перенаправление:

$ if { /usr/bin/pgrep -f "/home/tiger/bin/pymp" || /usr/bin/pgrep -f "/usr/bin/mpv2";} > /dev/null 2>&1 then do_stuff; fi

или

$ if /usr/bin/pgrep -f "/home/tiger/bin/pymp" > /dev/null 2>&1 || /usr/bin/pgrep -f "/usr/bin/mpv2" > /dev/null 2>&1 ; then do_stuff; fi
-2
03.02.2021, 21:19
2 ответа

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

Использование оператора диапазона ,увеличит количество регулярных выражений, но улучшит читаемость.

tac file_name |
sed -e '
  /use output/,/implicit/!b
  /use output/{h;d;}
  /implicit/G
'   |   
tac ;

Без обращения к оператору диапазона. Минимизирует количество регулярных выражений за счет сложности кода.

tac  file |
sed -e '
  /use output/!b
  $q;h;N;s/.*\n//
  :loop
    n
  /implicit/!bloop
  G
'    |
tac  ;
1
18.03.2021, 22:32

В случае, если утилита tacотсутствует, мы все еще можем сделать это в sed, но теперь мы не можем печатать, пока не увидим строку «use output», потому что мы не знаем, что другой «неявный "строка может быть до этого.

sed -n '
  /implicit/!bp
  h
  :loop
    ${g;bp;} 
    n
    /implicit/{x;p;bloop;}
    H
  /use output/!bloop
  G;s/\n[^\n]*$//
  :p;p
' file
0
18.03.2021, 22:32

Теги

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