답변:
이것은 당신을 위해 일할 수 있습니다 :
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
하셨습니까?