sed 스크립트에 매개변수를 전달할 수 있나요?

sed 스크립트에 매개변수를 전달할 수 있나요?

간단한 sed 스크립트를 고려해보세요 foo-to-bar.sed:

s/foo/bar/

그리고 간단한 호출:

sed -f foo-to-bar.sed some-file.txt

이제 대체 문자열(이 경우 bar)을 사용자 정의하고 이를 sed 스크립트에 매개변수로 전달한다고 가정해 보겠습니다. 그게 가능합니까?

참고: sed 스크립트를 제거하고 쉘 변수를 인라인으로 사용할 수 있다는 것을 알고 있습니다. 저는 특히 sed 스크립트에 매개변수를 전달하는 데 관심이 있습니다. 문서에서 아무것도 찾을 수 없지만 여전히 뭔가 빠졌기를 바라고 있습니다.

답변1

실제로 매개변수를 전달할 방법이 없는 것 같기 때문에 제가 생각할 수 있는 최선의 해결 방법은 명령줄에서 대체된 중간 자리 표시자를 사용하는 것입니다. foo-to-bar.sed:

s/foo/#ARG1#/

옮기다:

sed -f foo-to-bar.sed -e "s/#ARG1#/bar/g" some-file.txt

설명: foo먼저 로 바꾼 #ARG1#다음 bar명령줄에서 전달된 내용으로 바꿉니다. -e이후에 갖는 것이 중요하다는 점에 유의하시기 바랍니다 -f. 구분 기호도 특별한 것이 아니며 #일반적으로 파일에 표시되지 않는 것을 사용하십시오.

답변2

예, 전적으로 가능합니다! -
쉘에서 변수를 정의하고 다음과 유사하게 스크립트에서 변수 이름을 이스케이프할 수 있습니다.

s/'$replace'/bar/

그런 다음 스크립트를 다음과 같이 호출하십시오.

replace="foo" && sed -f script.sed

파일을 매개변수로 전달하려는 경우 여기서의 비결은 다음과 같은 매개변수 없이 스크립트를 끝내는 것입니다.

/foo/{
  s/foo/bar/
}

그런 다음 셸에서 또는 셸에서 xargs호출 find하고 매개변수를 바꾸도록 합니다.

find ./shelves -type f \( -name "*.json"  -o -name "*.csv" \) -print -exec sed -f main.sed {} \;

효과가있다!

답변3

좋은 해결책은 없지만 해결 방법이 있습니다. 가장 좋은 방법은 아마도 다음을 사용하는 것입니다 envsubst.

a.sed.tpl:

s/$s/x/

a.sh:

s=e
echo aoeu | sed -Ef <(cat a.sed.tpl | s=$s envsubst '$s')
$ bash -eu a.sh
aoxu

값은 있는 그대로 전달됩니다. 임의의 문자열을 전달하고 문자 그대로 처리하려면 를 실행하기 전에 이스케이프해야 합니다 sed.

$빠져나갈 길이 없어 보였습니다 envsubst.

더 많은 선택여기.

답변4

sed 코드에서 큰따옴표를 사용하는 한 sed 내부에 매개변수를 전달할 수 있습니다.

다음 연습을 시도해 보세요.

$ cat infile
Is it possible to pass arguments to a sed script?
$ fsed() { sed "s/pass/$1/g" "$2"; }
$ fsed PASS infile
Is it possible to PASS arguments to a sed script?

관련 정보