텍스트 파일에 저장된 임의의 메모리 주소 목록이 있는데 sed
이를 꺼내서 디코딩한 다음 다시 파일에 저장해야 합니다. 그러나 제가 수행하려는 디코딩 작업은 제가 얼마 전에 만든 C++ 프로그램에서 처리됩니다. 지금 겪고 있는 문제는 sed
명령에서 C++를 실행하는 것입니다. 즉, 디코딩해야 하는 부분을 역참조하여 C++ 프로그램에서 매개 변수로 사용하고 싶습니다. 나는 다음 명령을 작성했습니다.
cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';
내가 답을 읽을 기회를 갖기 전에이것게시물에는 sed
명령이 실행되지 않을 것이라고 말했습니다. 실제로 sed
명령을 실행하는 것이 허용되지 않습니까? 그렇다면 내가 작성한 명령이 유효한 sed
시퀀스라고 가정하면 어떻게 작성합니까 perl
?
답변1
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
perl -pe
: Likesed
: 에서 한 번에 한 라인씩 입력을 처리하고$_
, 각 라인에 전달된 perl [e] 표현식을 평가하고-e
, [p] 각 라인에 대한 수정 사항을 인쇄합니다$_
.s|X|Y|gei
:replaceY
inX
($_
[g] 전역, 대소문자를 구분하지 않는 [i],Y
기본 문자열 대신 perl [e] 표현식으로 처리됨).(?<=0x)
: 뒤를 봐0x
.[0-9a-f]{1,8}
: 16진수 1~8자리, 최대한 많이`./convAddrs $&`
: 쉘 명령줄의 출력을$&
일치하는 부분으로 바꿉니다.
답변2
sed
명령을 실행할 수 없다는 것이 사실일 수도 있고 아닐 수도 있습니다. 이것은아니요GNU의 실제 상황 sed
:
sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e 's/\n.//gp;g;s/^/#/e' <"$1"
귀하의 입력 내용에 정확히 무엇이 있는지 명확하지 않으므로 패턴 공간에 없는 내용을 주석 처리하는 데 <$1
주의하겠습니다 . 대체 시 GNU의 xecute 플래그를 사용하면 전체 결과 패턴 공간을 두 번째 인수로 전달한 다음 모든 패턴 공간을 stdout에 기록된 내용으로 바꿉니다. 따라서 위에서는 먼저 결과를 인쇄한 다음 명령줄을 셸에 전달한 후에 인쇄합니다.#
command \2
e
s///
$SHELL -c
$SHELL