다음 코드가 있습니다.
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
디버그 추적을 끄는 데 사용됩니다.