Как изменить размер изображений, чтобы уместить весь контент на минимальном холсте?

Насколько я понимаю, вам просто нужно найти любое слово (в общем случае) и вывести слово перед ним.

Решение в GNU sed :

sed -rn 's/(^|(.* ))([^ ]*) YOUR_WORD(( .*)|$)/\3/; T; p; q' 

Объяснение

-r является расширенным регулярным выражением GNU;

-n - команда не печатать;

( ^ | (. *)) - префикс перед словом, которое вы хотите напечатать. Это может быть начало строки ( ^ ) или ( | ) символы с окончанием пробела ( (. *) );

([^]) *) - слово, которое будет напечатано ( \ 3 );

ВАШЕ_СЛОВО - заменить его на слово после найденного слова. (Как «работает» после «процесса»);

((.*) | $) - конец строки после слов, конец ( $ ) или пробел и некоторые символы;

\ 3 - найденное слово;

T это «перейти к концу, если подстановка не прошла успешно», расширение GNU. Он перейдет в конец скрипта для каждой строки, которая не содержит ВАШЕ_СЛОВО в качестве не первого слова;

p - «буфер печати», печатать найденное слово (если T не работает в этой строке);

q - это команда для остановки выполнения sed , потому что мы уже нашли слово (не переходили с T ) и нам не нужно искать новые слова.

Обновление: решение без расширений GNU

sed -n 's/\(^\|\(.* \)\)\([^ ]*\) YOUR_WORD\(\( .*\)\|$\)/\3/; tprint; b; :print; p; q

Объяснение такое же, разница в обратных косых чертах и ​​ t . t работает как T , но перескакивает, если замена была успешной. Если это так, мы переходим к «print and quit», если нет - b отправляет как в скрипт, так и в обработку следующей строки.

2
13.04.2016, 22:56
1 ответ

Переменные сокращены только для наглядности кода, нет необходимости изменять фактические более длинные (и более удобные )имена переменных.

Функциональный код можно сократить, используя один экземпляр 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 
-1
27.01.2020, 22:47

Теги

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