bash 함수를 사용하여 sed에서 대체 문자열을 만드는 방법, 특히 일반적으로 \1, \2, ...?로 식별되는 하나 이상의 발견된 부분이 있는 함수입니다.
즉, 나는 다음과 같은 작업을 수행하고 싶습니다.
sed -e 's/\(.*\)/<bash_function \1>/'
참고: 이 Q는 다음과 유사합니다.sed 표현식에 쉘 명령을 포함시키는 방법은 무엇입니까?, 그러나 GNU/Linux 명령을 호출하는 대신 간단히 기본 bash 함수를 호출하고 싶습니다.
답변1
다음 e
플래그를 사용하여 GNU sed를 사용하여 이를 수행할 수 있습니다:
이자형
이 명령을 사용하면 쉘 명령의 입력을 패턴 공간으로 파이프할 수 있습니다. 대체가 이루어지면 패턴 공간에 있는 명령이 실행되고 해당 출력이 패턴 공간을 대체합니다. 후행 줄 바꿈은 억제됩니다. 실행할 명령에 NUL 문자가 포함되어 있으면 결과가 정의되지 않습니다. 이것은 GNU sed 확장입니다.
다음 제한 사항이 적용됩니다.
그런 다음 전체 결과 "패턴 공간"(즉, 검색 및 교체 후 전체 입력 문자열)이 실행됩니다. 즉, 마지막 두 슬래시 사이에 있는 내용뿐만 아니라 실행됩니다. 이는 귀하의 예에서 보여주는 것이지만 실제로 원하는 것이 아닐 수도 있습니다.
당신의 시스템
/bin/sh
은bash
여기에 설명된 대로 함수를 내보냈습니다.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