"sed" 내에서 명령 실행

"sed" 내에서 명령 실행

텍스트 파일에 저장된 임의의 메모리 주소 목록이 있는데 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: Like sed: 에서 한 번에 한 라인씩 입력을 처리하고 $_, 각 라인에 전달된 perl [e] 표현식을 평가하고 -e, [p] 각 라인에 대한 수정 사항을 인쇄합니다 $_.
  • s|X|Y|gei:replace Yin X( $_[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 \2es///$SHELL -c$SHELL

관련 정보