sed
다음 명령이 어떻게 작동하는지 알고 싶습니다 .
sed -nre "/jar$/ { x; d; }; /class$/ { x; p; }
실제로 주어진 jar 파일 목록에서 특정 클래스 파일을 찾는 것은 또 다른 명령의 일부입니다.
find . -name "*jar" -print -exec jar -tf '{}' \; | grep -E "jar$|CLASS_NAME" | sed -nre "/jar$/ { x; d; }; /class$/ { x; p; } "
답변1
먼저 명령줄 옵션부터 시작해 보겠습니다.
-n
버퍼의 정상적인 출력을 비활성화합니다. 인쇄하도록 요청된 행만 인쇄합니다(예:p
명령 사용).-r
확장 정규식 활성화-e
파일이 아닌 명령줄에서 sed 명령을 지정할 때는 실제로 필요하지 않습니다.
이제 sed 명령이 나옵니다. ;
문자별로 구분된 두 개가 있습니다 . Sed는 두 명령을 한 줄씩 순서대로 실행합니다. 하지만 일치하는 경우에만 가능합니다. 여기서 두 명령 모두 앞에 붙습니다. /SOMETHING/
즉, 현재 줄이 정규식과 일치하는 경우에만 명령이 실행됩니다 SOMETHING
.
/jar$/
regexp는 현재 줄과 일치합니다 jar
. 유사한 /class$/
정규식은 현재 줄과 일치합니다 class
. 이제 특정 줄이 일치하면 그 안의 두 가지 명령이 실행됩니다(그룹화됨 {}
). 첫 번째 경우 x
, 그 다음 d
명령. 두 번째 경우에는 주문 x
됩니다 p
.
x
명령은 입니다eXchange
.sed
일부 라인을 저장하는 데 사용할 수 있는 버퍼가 있습니다. 이 명령은 이 버퍼를 현재 라인과 교환합니다(따라서 현재 라인이 이 버퍼로 들어가고 버퍼 내용이 현재 라인이 됩니다).d
이 명령은 현재 줄을 버리고 새 줄을 읽고 첫 번째 줄부터 시작하여 sed 명령을 실행합니다(d
현재 줄 이후의 모든 명령은 무시됩니다).p
이 명령은 현재 행을 인쇄합니다. 명령 인수를 사용하고 있으므로-n
인쇄된 줄만p
출력에 나타납니다.
결론적으로:
/jar$/ { x; d; }
표현 - 현재 줄이 로 끝나면jar
버퍼에 저장합니다./class$/ { x; p; }
의미 - 현재 줄이 로 끝나는 경우class
버퍼 내용을 가져오고(jar
이미 로 끝나는 파일이 없는 한 으로 끝나는 마지막 줄을 포함해야 함class
) 인쇄합니다.