쉘 함수에서 sed에 변수 목록을 전달하는 방법

쉘 함수에서 sed에 변수 목록을 전달하는 방법

특정 문자열이 포함된 줄 끝에 여러 변수를 추가하고 싶습니다. 이것은 내 기능입니다.

function () { sudo sed -i '/^STRING/ s/$/ '$@'/' FILE; }

그러나 나는 얻었다sed: -e expression #1, char 24: unterminated `s' command

이 함수의 모든 인수를 sed에 어떻게 전달할 수 있나요?

예:

파일은 다음과 같습니다.

sometext
sometext STRING sometext
sometext

명령을 실행한 후 function test1 test2파일은 다음과 같이 변경되어야 합니다.

sometext
sometext STRING sometext test1 test2
sometext

답변1

"다중 변수"를 첨부하지 않았습니다. 문자열을 추가하고 있습니다. 함수에 대한 가장 간단한 인터페이스는 단일 문자열을 인수로 사용하여 함수를 호출하는 것입니다.

myfunction 'test1 test2'

then ( function일부 쉘에서는 키워드이므로 함수 이름으로 사용되지 않음)

myfunction () {
  sudo sed -i "/^STRING/ s/\$/ $1/" FILE
}

매개변수가 sed 스크립트에 삽입되므로 이는 실제로 지정된 문자열을 추가하지 않습니다. 매개변수의 또는 매개변수는 /문자 그대로 해석되지 않습니다. \먼저 인수를 준비하여 이 문제를 해결할 수 있습니다.

myfunction () {
  extra=$(printf '%s\n' "$1" | sed 's![\\/]!\\&!g')
  sudo sed -i "/^STRING/ s/\$/ $extra/" FILE
}

또는 Perl과 같은 다른 도구를 사용할 수도 있습니다.

myfunction () {
  sudo env extra="$1" perl -i -pe '/^STRING/ s/$/\Q$ENV{extra}/' FILE
}

함수가 일련의 문자열을 인수로 사용하고 사이에 공백을 두고 순서대로 추가하도록 하려면 를 사용할 수 있습니다 "$*". 이는 함수에 대한 모든 인수와 There 사이의 인수를 포함하는 단어로 확장됩니다. 사이에 공간이 있습니다.

myfunction () {
  extra=$(printf '%s\n' "$*" | sed 's![\\/]!\\&!g')
  sudo sed -i "/^STRING/ s/\$/ $extra/" FILE
}

관련 정보