이 sed 명령은 어떻게 작동합니까?

이 sed 명령은 어떻게 작동합니까?

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) 인쇄합니다.

관련 정보