Передайте строки по каналу через sort -n -r -k2
. Отредактированный к виду от самого большого до самого маленького.
Я не уверен, как Вы сделаете это с grep, но для таких задач я предпочитаю awk. Это передает большему количеству управления, что я хочу сделать. хотя я не опытен в awk, и все еще учащий лишь вот то, как я достиг бы этого.
PKGNAM="package-name"; awk "/$PKGNAM\$/,/requires:/ { if ( \$0 ~ /requires:/ ) { sub( /^requires:.?/, \"\" ); print } }"
ОБНОВЛЕНИЕ: обновленный пример awk команда, теперь это использует переменную PKGNAM для соответствия имени pacakge.
HTH.
Grep рассматривает все строки независимо, таким образом, он не может сделать задания самостоятельно.
Awk является общим инструментом обработки текста. Отслеживайте то, что текущий пакет (в переменной p
), и вывод соответствие, если a requires:
строка найдена в правильном пакете (удаляющий requires:
префикс).
<setup.ini awk -vpackage='NAME_OF_PACKAGE' '
sub(/^@ */,"") {p=$0}
p==package && sub(/^requires: */,"") {print}
'
Другой подход awk должен обработать вход, разграниченный новой строкой -@
последовательности, а не новые строки. Или, так как разделы пакета имеют пустую строку между ними, обрабатывают введенный абзацем: передайте пустую строку как разделитель записей RS
(что означает, что записи разделяются одним или несколькими пустая строка). Затем для каждой строки в популярной записи, если строка начинается requires:
, распечатайте его (минус префикс).
<setup.ini awk -vpackage='NAME_OF_PACKAGE' -vRS= -vFS='\n' '
sub(/^@ */,"") && $1==package {
for (i=2; i<NF; i++) {if (sub(/^requires: */,"",$i)) print $i}
}'
Другая возможность является режимом абзаца Perl (-00
). Если абзац запускается с правильного заголовка (/REGEXP/m
означает многострочное соответствие, так, чтобы $
привязка означает конец строки, а не конец строки), и это содержит a requires:
строка, затем распечатайте ту строку (минус префикс).
<setup.ini package=NAME_OF_PACKAGE perl -00 -ne '
/\A@ *$ENV{package}$/m and /^requires: *(.*)$/m and print "$1\n"'
И вот один для (GNU) sed любители. (Вы, как ожидают, не поймете это.)
sed -ne '/^@/ { h; b; }; G; s/^requires: *\(.*\)\n@ *NAME_OF_PACKAGE$/\1/p'
Вот a sed
решение, которое может сделать это без обратной ссылки.
# cf. "3.3. Addressing and address ranges",
# http://sed.sourceforge.net/sedfaq3.html#s3.3 (esp. (6) Relentless. ...)
PKGNAME="package-name"
sed -ne '/^ *@ *'"${PKGNAME}"'/{
:a
N
/\n *requires: /!ba
s/.*\n *requires: *//
p
}' setup.ini
Жабры (GNU) sed
решения работают над Mac OS X 10.6.7 (использование FreeBSD sed) если b
команда помещается на отдельную строку (или по крайней мере сопровождается разрывом строки).
PKGNAME="package-name"
sed -ne '/^ *@ *'"${PKGNAME}"'/{h
b
};G;s/^ *requires: *\(.*\)\n *@ *'"${PKGNAME}"' *$/\1/p' setup.ini