![sed를 사용하여 텍스트를 바꿀 수 없습니다](https://linux55.com/image/110811/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EB%B0%94%EA%BF%80%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
저는 스크립트를 작성 중인데 그 중 일부에는 파일의 일부 매개변수를 바꾸는 작업이 포함됩니다.
매개변수를 찾아서 바꾸려고 하는데 sed를 디버그해야 합니다.
sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g" /usr/share/migrationtools/migrate_common.ph
대상 파일:
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "padl.com";
# Default base
$DEFAULT_BASE = "dc=padl,dc=com"
스크립트:
echo "Enter the email domain"
read E_DOMAIN
echo "The email domain will be "$E_DOMAIN".com"
sleep 2
E_DOMAIN_VAR=$E_DOMAIN.com
sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g" /usr/share/migrationtools/migrate_common.ph
답변1
나는 다음과 같은 것을 추천하고 싶습니다.
sed -i 's|$DEFAULT_MAIL_DOMAIN = \"padl.com\";|$DEFAULT_MAIL_DOMAIN = \"$E_DOMAIN\";|' /usr/share/migrationtools/migrate_common.ph
내가 변경한 사항:
- sed로 변경하고 주변의 작은따옴표를 바꿉니다. 모든 큰따옴표는 확실히 문제를 일으킬 수 있습니다.
- sed 대체 구문이 에서 변경되었습니다
/
.|
이 부분은 필수가 아닙니다. 나는 그것이 더 좋다./
원한다면 보관할 수 있습니다. - 다음으로 검색 주위의 큰따옴표를 제거하고 텍스트를 바꿨습니다. 필요하지 않습니다.
- 파일 텍스트에 실제로 존재하는 큰따옴표는 이스케이프됩니다.
- sed 대체가 끝나면 전역 플래그가 제거되었습니다. 이는 한 줄에 한 번만 발생하는(아마도 파일당 한 번) 구성 파일의 매개변수처럼 보입니다.
답변2
$DEFAULT_MAIL_DOMAIN
따옴표가 파일의 리터럴 부분 인 경우 작은 따옴표나 백슬래시를 사용하여 이스케이프 처리해야 합니다. 따라서 다음 상황 중 하나에 해당합니다.
$ E_DOMAIN=foobar.com
$ sed -e 's/$DEFAULT_MAIL_DOMAIN = "padl.com"/$DEFAULT_MAIL_DOMAIN = "'"$E_DOMAIN"'"/' file
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "foobar.com";
...
$ sed -e "s/\$DEFAULT_MAIL_DOMAIN = \"padl.com\"/\$DEFAULT_MAIL_DOMAIN = \"$E_DOMAIN\"/" file
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "foobar.com";
먼저, 인용문을 다음과 같이 설명합니다.
'.../$DEFAULT_MAIL_DOMAIN = "'"$E_DOMAIN"'"/'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ - single-quoted, literal ""s
^^^^^^^^^^^ - double-quoted, var expanded
두 번째 항목에서는 전체 내용이 질문이 포함된 큰따옴표로 묶인 문자열 $
이며 "
이스케이프됩니다. 하지만 우리는 그 변수를 확장하고 싶기 때문에 $
포함 하지 않습니다.$E_DOMAIN
E_DOMAIN
변수가 또는 이어야 하는지 잘 모르겠습니다 E_DOMAIN_VAR
. .com
후자에 접미사를 추가했지만 sed
명령에서는 전자를 사용했습니다. 어떤 경우 든 변수의 /
, &
또는 개행 문자는 구체적으로 처리되지만 sed
도메인 이름에는 이러한 문자가 포함되어서는 안 됩니다.
코드 조각에서 인용문이 약간 벗어났습니다.
sed -i "s/"$DEFAULT_MAIL_DOMAIN = "padl.com";"/"$DEFAULT_MAIL_DOMAIN = "$E_DOMAIN";"/g"
첫 번째 부분 "s/"
은 따옴표로 묶인 문자열이고 그 다음은 $DEFAULT_MAIL_DOMAIN
바깥쪽 따옴표이므로 변수(아마도 빈 문자열)로 확장됩니다. 공백도 인용되지 않으므로 sed
여러 인수가 발생하고 불평할 수 있습니다. "padl.com"
다시 인용되지만 세미콜론은 인용되지 않으므로 쉘은 이를 명령을 종료하는 것으로 해석합니다.