더 나은 설명을 위해 내 질문을 해보자. 저는 cygwin을 사용하고 있으며 설치는 다음 setup.ini 형식을 기반으로 합니다.
@ package-name
sdesc: "short description, on one line"
ldesc: "long description of arbitrary length, commonly multiple lines"
category: categories in which the packege belonges, one line
requires: packages (libs etc) required by this package, one line
그런 다음 아래 패키지 등이 있습니다.
필요한 것은 패키지 이름이 주어지면 해당 패키지에 필요한 모든 패키지를 출력하는 것입니다(가능한 경우 "requires" 접두사 없이).
나는 이것이 기본 grep이라고 확신하지만 처음 접했습니다. 감사해요.
답변1
이 작업을 수행하기 위해 grep을 어떻게 사용할지 잘 모르겠지만 이러한 유형의 작업에는 awk를 선호합니다. 그것은 내가 하고 싶은 일을 더 잘 통제할 수 있게 해준다. 저는 awk에 대한 전문가는 아니지만 아직 배우고 있지만 이를 달성한 방법은 다음과 같습니다.
PKGNAM="package-name"; awk "/$PKGNAM\$/,/requires:/ { if ( \$0 ~ /requires:/ ) { sub( /^requires:.?/, \"\" ); print } }"
고쳐 쓰다:PKGNAM 변수를 사용하여 패키지 이름과 일치하도록 예제 awk 명령을 업데이트했습니다.
HTH.
답변2
Grep은 모든 행을 독립적으로 처리하므로 단독으로 작업을 수행할 수 없습니다.
awk는 일반적인 텍스트 처리 도구입니다. 현재 패키지가 무엇인지(변수에서) 추적하고, 올바른 패키지에서 행이 발견되면 p
일치 항목을 출력합니다(접두사가 제거됨).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
여러 줄 일치를 나타내므로 $
앵커는 문자열의 끝이 아닌 줄의 끝을 나타냄)로 시작하고 line 을 포함하는 경우 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'
답변3
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
Gilles'(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