sed 내의 서브쉘

sed 내의 서브쉘

파일 시작 부분에 이것을 추가할 수 있습니다.

sed -i '1s/^/word\n/' file

그래요읽다큰따옴표를 사용하면 변수를 확장할 수 있으므로 다음을 시도합니다.

sed -i "1s/^/$(printenv)\n/" file

나는 결국 돌아왔다:

sed: -e expression #1, char 15: unterminated `s' command

무슨 일이야? 변수의 내용이나 다른 것과 관련이 있습니까?

답변1

나는 다음이 효과가 있다고 생각합니다.

sed -i '1 e printenv' file

GNU sed 매뉴얼에서:

'e COMMAND'
     Executes COMMAND and sends its output to the output stream.  The
     command can run across multiple lines, all but the last ending with
     a back-slash.

또는 를 사용할 수 있지만 cat이를 위해서는 임시 파일을 만들어야 합니다.

cat <(printenv) file > temporary_file; mv temporary_file file

패키지가 컴퓨터에 설치된 경우 moreutils다음 명령을 사용하면 임시 파일을 수동으로 생성하는 것을 방지할 수 있습니다 sponge.

cat <(printenv) file | sponge file

답변2

콘텐츠 삽입앞으로라인 1:

ed -s file <<< $'0r !printenv\nwq'

콘텐츠 삽입뒤쪽에라인 1:

ed -s file <<< $'1r !printenv\nwq'

답변3

OP의 질문에 더 직접적으로 대답하려면 예, 서브 쉘이 출력하는 것과 관련이 있습니다. Bash가 인식하고 큰따옴표 안에 의미를 유지하는 특수 문자는 셸에서 잘못 해석되어 printenv많은 문제를 일으킬 것입니다. 이 오류의 가장 가능성 있는 원인 unterminated 's'은 값이 printenv여러 줄 길이이고 seds 명령이 해당 줄 끝에서 완료될 것으로 예상되기 때문입니다. 이 명령으로 바꾸려는 것은 무엇이든 특수 문자를 제거하거나 이스케이프하고 리터럴 s 로 sed바꾸는 등의 작업을 전처리해야 합니다 .newlines\n

관련 정보