간단한 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?