sed를 사용하여 텍스트를 바꿀 수 없습니다

sed를 사용하여 텍스트를 바꿀 수 없습니다

저는 스크립트를 작성 중인데 그 중 일부에는 파일의 일부 매개변수를 바꾸는 작업이 포함됩니다.

매개변수를 찾아서 바꾸려고 하는데 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"다시 인용되지만 세미콜론은 인용되지 않으므로 쉘은 이를 명령을 종료하는 것으로 해석합니다.

관련 정보