Mac에서 sed를 사용하여 단어 뒤에 문구를 삽입하는 방법

Mac에서 sed를 사용하여 단어 뒤에 문구를 삽입하는 방법

다음 코드가 있습니다.

sed  -i  "/#alias/a alias ll='ls -laGh'" /etc/zshrc
sed  -i  "/#alias/a alias l='ls -l'" /etc/zshrc

/etc/zshrc 파일에 다음이 있습니다.

#alias

하지만 코드를 실행하면 다음 오류가 발생합니다.

sed: 1: "/etc/zshrc": invalid command code z

무슨 일이 일어나는지 이해가 안 돼요

해야한다:

#alias
alias ll='ls -laGh'
alias l='ls -l'

그것은 나에게 도움이 되지 않습니다:

#alias
alias ll='ls -laGh' alias l='ls -l'

답변1

여기에는 두 가지 문제가 있습니다. 첫 번째는 macOS 버전에서는 백업 파일에 사용할 확장자를 알려주는 옵션 sed에 대한 명시적인 인수가 필요하다는 것입니다. -i백업을 원하지 않으면 그 뒤에 빈 인수( sed -i '' ...)를 전달해야 합니다. 보다이것그리고이것스택오버플로우에서.

두 번째 문제는 a명령이 추가될 문자열 앞에 이스케이프된 줄 바꿈이 필요하고 그 뒤에 줄 바꿈이 필요하다는 것입니다. [ man페이지]에서:

 [1addr]a\
 text    Write text to standard output immediately before each attempt to
         read a line of input, whether by executing the ``N'' function or
         by beginning a new cycle.

이 두 가지를 모두 고려하면 원하는 대로 작동합니다.

sed -i '' "/#alias/a\\
alias ll='ls -laGh'
" /etc/zshrc

명령 문자열에서 명시적인 줄 바꿈을 피하려면 를 정의한 nl=$'\n'다음 ${nl}명시적인 줄 바꿈 대신 사용할 수 있습니다. 한 번에 여러 줄을 추가하려면 루프를 사용하여 sed한 번에 모든 줄을 추가하는 명령을 구성하는 경향이 있습니다.

nl=$'\n'
sedcmd=""
for aliascmd in "alias ll='ls -laGh'" "alias l='ls -l'"; do
    sedcmd+="a\\${nl}${aliascmd}${nl};"
done
sed -i '' "/#alias/ { ${sedcmd} }" /etc/zshrc

또는 여러 명령을 실행하려는 경우:

nl=$'\n'
sed -i '' "/#alias/a\\${nl}alias ll='ls -laGh'${nl}" /etc/zshrc
sed -i '' "/#alias/a\\${nl}alias l='ls -l'${nl}" /etc/zshrc

이 마지막 옵션이 여전히 작동하지 않으면 실행 set -x한 후 다시 시도하세요. zsh를 사용한다고 가정하면 다음과 같은 내용이 표시됩니다.

+zsh:10> sed -i '' $'/#alias/a\\nalias ll=\'ls -laGh\'\n' /etc/zshrc
+zsh:11> sed -i '' $'/#alias/a\\nalias l=\'ls -l\'\n' /etc/zshrc

(숫자만 +zsh:something다를 것이며 터미널 cwd 업데이트와 관련 없는 내용도 많이 있을 것입니다.) 이것이 모든 것을 한 줄에 넣을 것이라고 생각할 수 있는 유일한 이유는 명령 sed이 없습니다:

+zsh:11> sed -i '' $'/#alias/a\\nalias l=\'ls -l\'\n' /etc/zshrc
                                                  ^^
                                          this bit here

그런데 set +x디버그 추적을 끄는 데 사용됩니다.

관련 정보