Насколько я понимаю, вам просто нужно найти любое слово (в общем случае) и вывести слово перед ним.
Решение в GNU sed
:
sed -rn 's/(^|(.* ))([^ ]*) YOUR_WORD(( .*)|$)/\3/; T; p; q'
-r
является расширенным регулярным выражением GNU;
-n
- команда не печатать;
( ^ | (. *))
- префикс перед словом, которое вы хотите напечатать. Это может быть начало строки ( ^
) или ( |
) символы с окончанием пробела ( (. *)
);
([^]) *)
- слово, которое будет напечатано ( \ 3
);
ВАШЕ_СЛОВО
- заменить его на слово после найденного слова. (Как «работает» после «процесса»);
((.*) | $)
- конец строки после слов, конец ( $
) или пробел и некоторые символы;
\ 3
- найденное слово;
T
это «перейти к концу, если подстановка не прошла успешно», расширение GNU. Он перейдет в конец скрипта для каждой строки, которая не содержит ВАШЕ_СЛОВО
в качестве не первого слова;
p
- «буфер печати», печатать найденное слово (если T
не работает в этой строке);
q
- это команда для остановки выполнения sed
, потому что мы уже нашли слово (не переходили с T
) и нам не нужно искать новые слова.
sed -n 's/\(^\|\(.* \)\)\([^ ]*\) YOUR_WORD\(\( .*\)\|$\)/\3/; tprint; b; :print; p; q
Объяснение такое же, разница в обратных косых чертах и t
. t
работает как T
, но перескакивает, если замена была успешной. Если это так, мы переходим к «print and quit», если нет - b
отправляет как в скрипт, так и в обработку следующей строки.
Переменные сокращены только для наглядности кода, нет необходимости изменять фактические более длинные (и более удобные )имена переменных.
Функциональный код можно сократить, используя один экземпляр identify
вместо четырех, используя read
для загрузки переменных, (с неэффективным использованием xargs
для сохранения строки кода ), плюс несколько bash
измов:
read mw1 mh1 mw2 mh2 <<< $(identify -ping -format "%w %h " [12].png)
mw="$((mw1>mw2?mw1:mw2))"
mh="$((mh1>mh2?mh1:mh2))"
echo {1,1,2,2}.png | xargs -n 2 convert -extent "${mw}x${mh}" -background transparent
Или, может быть, чище использовать массивы вместо переменных:
read w[1] h[1] w[2] h[2] <<< $(identify -ping -format "%w %h " [12].png)
w[0]="$((w[1]>w[2]?w[1]:w[2]))"
h[0]="$((h[1]>h[2]?h[1]:h[2]))"
echo {1,1,2,2}.png |
xargs -n 2 convert -extent "${w[0]}x${h[0]}" -background transparent