답변:
이것은 당신을 위해 일할 수 있습니다 :
sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file
각각의 경우 i(삽입), a(첨부) 및 c(변경) 명령은 줄 바꿈으로 종료해야합니다.
일반적으로 명령은 ;예를 들어 분리하고 } 예를 들어 /foo/d;/bar/d그룹화 할 수 있지만 명령의 경우 명령 을 분리하는 방법을 제공합니다.{.../foo/{h;d}i,a,c-e
대안은 쉘 (bash)을 사용하여 개행을 삽입하는 것입니다.
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
-e세미콜론이 아닌 newlines /를 사용하여 레이블 및 분기 명령을 종료해야합니다 . 작동하지 않습니다 : sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". 그러나 이것은 :sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newline문구가 여기 에서 얼마나 필요한지 잘 모르겠습니다 . 내 cygwin에서 여기에서 테스트하면 다음 과 같이 작동합니다 sed '/foo/i\bar' file. 이제 우리는 별도의 표현을 하나로 통합 할 수있게되었으므로 원래의 질문에 다시 제기됩니다 -e.
도움에 대한 sed당신은 발견 할 것이다 -e플래그 스탠드을 위해 :
-e script, --expression=script
add the script to the commands to be executed
그러나 당신은 마주 친 후 처음으로 혼동하지 않습니다 -e. 당신의 예에서 sed 's/foo/bar/'와 sed -e 's/foo/bar/'동일합니다. 두 경우 모두 s/foo/bar/는 IS 스크립트 나오지에 의해 실행된다. 두 번째 옵션은 더 명확하지만 아마도 자주 -e사용되는 이유는 아닙니다 . 그 이유 -e는 같은 호출로 두 개 이상의 스크립트를 사용할 수 있기 때문입니다 sed. 그래도 하나의 스크립트 만 사용하는 경우 왜 그것을 사용 하는가? 다음 예제는이를 설명 할 수 있습니다.
echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
"foo"를 출력합니다.
하나,
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
sed첫 번째 s/foo/bar파일 이름으로 해석 하기 때문에 실패 합니다. 따라서 미래의 삶을 더 쉽게하기 위해 이미 -e깃발 을 사용할 수 있습니다. 그러면 앞으로를 사용하여 명령을 추가 스크립트로 추가 할 수 있습니다 -e <script>.
NB 다른 답변에서 ;여러 스크립트를 사용하는 대안으로 사용하는 것이 제안되었습니다. 어떤 경우에는 기술적으로 가능하지만 코드를 읽기가 매우 어렵 기 때문에 권장하지 않습니다. https://www.grymoire.com/Unix/Sed.html#uh-61 의 예를 참조하십시오.
man sed하셨습니까?