그래서 저는 현재 이전 시스템 관리자로부터 전달된 스크립트 배치를 리버스 엔지니어링하려고 합니다.
쉘 스크립트 중 하나에 제가 (평생 동안) 이해할 수 없는 줄이 있습니다. 여기있어:-
sed -n 'H;${x;s/^\n//;s/-jar\n/Dcom.sun.management.jmxremote.ssl=false\n&/;p;}' "$File"
GNU Bash 4.2.46(2) RHEL6 64비트.
답변1
이 명령에는 GNU가 필요하며 줄 끝의 첫 번째 항목 앞에 문자열을 삽입하고 그 뒤에 개행 문자가 오는 sed
것처럼 보입니다 .Dcom.sun.management.jmxremote.ssl=false
-jar
예:
something
something
something-jar
something
로 변환되다
something
something
somethingDcom.sun.management.jmxremote.ssl=false
-jar
something
이 sed
명령은 파일의 각 줄을 실행하여 전체 파일을 메모리로 읽어옵니다 H
(현재 줄을 "예약된 공간"에 추가하고 시작 부분에 개행 문자 추가). 마지막 라인( )에 도달하면 $
예약된 공간을 패턴 공간( x
)으로 바꾸고 첫 번째 개행 문자( H
파일의 첫 번째 라인을 실행하여 거기에 배치됨)를 제거합니다. 그런 다음 (the는 표현식과 일치하는 모든 것임) -jar\n
로 대체됩니다 . 그런 다음 수집된 행( )을 인쇄합니다.Dcom.sun.management.jmxremote.ssl=false\n-jar\n
&
p
동일한 작업을 수행하는 또 다른 방법 awk
:
awk 'skip==0 && sub("-jar$", "Dcom.sun.management.jmxremote.ssl=false\n-jar") { skip=1 } { print }' "$File"
이는 모든 줄에서 동일한 교체를 시도하고, 성공하면 skip=1
다시 시도하지 않도록 이를 설정합니다. 대체 발생 여부에 관계없이 각 행이 인쇄됩니다.
이것은 실제로아니요전체 파일을 메모리에 저장합니다.