bash 기능을 sed 표현식에 포함시키는 방법은 무엇입니까?

bash 기능을 sed 표현식에 포함시키는 방법은 무엇입니까?

bash 함수를 사용하여 sed에서 대체 문자열을 만드는 방법, 특히 일반적으로 \1, \2, ...?로 식별되는 하나 이상의 발견된 부분이 있는 함수입니다.

즉, 나는 다음과 같은 작업을 수행하고 싶습니다.

sed -e 's/\(.*\)/<bash_function \1>/'

참고: 이 Q는 다음과 유사합니다.sed 표현식에 쉘 명령을 포함시키는 방법은 무엇입니까?, 그러나 GNU/Linux 명령을 호출하는 대신 간단히 기본 bash 함수를 호출하고 싶습니다.

답변1

다음 e플래그를 사용하여 GNU sed를 사용하여 이를 수행할 수 있습니다:

이자형

이 명령을 사용하면 쉘 명령의 입력을 패턴 공간으로 파이프할 수 있습니다. 대체가 이루어지면 패턴 공간에 있는 명령이 실행되고 해당 출력이 패턴 공간을 대체합니다. 후행 줄 바꿈은 억제됩니다. 실행할 명령에 NUL 문자가 포함되어 있으면 결과가 정의되지 않습니다. 이것은 GNU sed 확장입니다.

다음 제한 사항이 적용됩니다.

  1. 그런 다음 전체 결과 "패턴 공간"(즉, 검색 및 교체 후 전체 입력 문자열)이 실행됩니다. 즉, 마지막 두 슬래시 사이에 있는 내용뿐만 아니라 실행됩니다. 이는 귀하의 예에서 보여주는 것이지만 실제로 원하는 것이 아닐 수도 있습니다.

  2. 당신의 시스템 /bin/shbash

  3. 여기에 설명된 대로 함수를 내보냈습니다.Bash에서 함수를 "내보낼" 수 있나요?

예를 들어, 내 시스템( 기본적으로 /bin/sh쉘이 있는 경우 dash)에서 단계는 다음과 같습니다.

sudo ln -sf bash /bin/sh

foo() { echo "Doing foo on $1"; }
export -f foo

그럼 난 할 수 있어

$ echo bar | sed 's/\(.*\)/foo \1/e'
Doing foo on bar

다음은 검색 및 바꾸기를 수행한 후 전체 입력 문자열을 더욱 명확하게 하는 또 다른 예입니다.

echo 'bar; echo xx' | sed 's/\(.*\)/foo \1/e'
Doing foo on bar
xx

/bin/sh그렇게 할 수 없다면 bash가장 가까운 방법은 함수 정의를 파일에 넣고 먼저 가져오는 것입니다.

$ echo bar | sed 's/\(.*\)/foo \1/e'
sh: 1: foo: not found

하지만 주어진

$ cat ./myfuncs.sh 
foo() { echo "Doing foo on $1"; }

그 다음에

$ echo bar | sed 's/\(.*\)/. .\/myfuncs.sh ; foo \1/e'
Doing foo on bar

관련 정보