#!/bin/bash
wineuser=tom
su $wineuser -c "sed -i '$ialias ptgui "wine ~/.wine/drive_c/Program\ Files/PTGui/PTGui.exe\"' /usr/people/$wineuser/config/cshrc.csh"
Tom의 cshrc.csh에 삽입된 실제 행은 다음과 같아야 합니다.
alias ptgui 'wine ~/.wine/drive_c/Program\ Files/PTGui/PTGui.exe'
sed 명령 '$ialias...' $i는 파일의 마지막 줄 앞에 삽입되며 정의된 변수가 아닙니다.
다단계 탈출을 설명하는 팁이나 매뉴얼도 환영합니다.
답변1
이론
규칙은 다음과 같습니다:
'
구분된 문자열 내에서는 아무것도 해석되지 않으며 a 이외의 다른 내용은'
특별한 의미가 없습니다. 이는 이스케이프만 필요하다는 의미'
이지만, 이스케이프하려면'\''
. (첫 번째 문자열은'
문자열을 끝내고\'
리터럴'
(새 문자열의 시작을 방지하기 위해 이스케이프 처리)이 뒤따르고, 마지막 문자열은'
새 문자열을 시작합니다. 이 세 문자열은 구분 기호(일반적으로 공백)로 구분되지 않으므로 하나의 연속된 문자열로 처리됩니다.string 내부에서
"
변수 확장이 발생하고 이스케이프가 해석됩니다. 따라서 리터럴을 원하면\
이스케이프해야 합니다. 또한 리터럴을 원한다면$
이를 이스케이프해야 합니다(그렇지 않으면 변수 확장으로 해석됩니다).
필요에 따라 이 두 가지 인용 스타일을 결합하여 다양한 방법으로 명령을 이스케이프할 수 있습니다. 아래 목록은 특정 문제에 대한 가능한 해결책 중 하나입니다.
sed
또한 이스케이프 문자로 도 해석된다는 점을 명심하세요 \
. 즉, 스크립트에서 문자 그대로 사용할 때 해당 문자를 이스케이프해야 한다는 뜻이기도 합니다 sed
.
예
개인적으로 나는 가장 안쪽의 코드 단위부터 시작하여 바깥쪽으로 작업하는 것이 더 쉽다고 생각합니다. 매번 내부 코드 단위의 외부 참조 메서드에서 사용되는 특수 문자를 참조합니다.
예를 들어, 파일의 문자열을 바꾸고 It's a test
그 결과를 파일에 저장하려는 경우 다음과 같이 따옴표를 사용하면 더 쉽게 만들 수 있습니다.It's my test
/home/user/I have spaces in my name.txt
/home/user/NoSpaces.txt
"
sed "s/It's a test/It's my test/" "/home/user/I have spaces in my name.txt" >/home/user/NoSpaces.txt
이제 이를 변수에 저장하려면 다른 참조 레벨을 추가해야 합니다.
다음 방법을 사용하여 이 작업을 수행할 수 있습니다 ( 현재 문자열의 다른 문자를
'
이스케이프하는 것을 의미함 ).'
myvar='sed "s/It'\''s a test/It'\''s my test/" "/home/user/I have spaces in my name.txt" >/home/user/NoSpaces.txt'
"
스타일 인용문을 사용하여 이를 수행 할 수도 있습니다 .myvar="sed \"s/It's a test/It's my test/\" \"/home/user/I have spaces in my name.txt\" >/home/user/NoSpaces.txt"
경험 법칙은 항상 가장 깨끗하다고 생각되는 솔루션을 선택하는 것입니다.
떨어져 있는
특정 문제에 대해서는 다음을 시도해 볼 수 있습니다.
cmd="sed -i '\$ialias ptgui '\\''wine ~/.wine/drive_c/Program\\\\ Files/PTGui/PTGui.exe'\\' /usr/people/$wineuser/config/cshrc.csh"
su "$wineuser" -c "$cmd"
nsert 명령 a
대신 pend를 사용하는 것이 좋지만 이는 질문의 범위를 벗어납니다.i
sed