sed를 실행하면 "일치 항목을 찾는 동안 예기치 않은 EOF" 오류가 발생합니다.

sed를 실행하면 "일치 항목을 찾는 동안 예기치 않은 EOF" 오류가 발생합니다.

그것이 문제이다.
"root" 사용자로 "myusername" 사용자로 명령을 실행하려고 합니다.

그래서 나는 su - $USERNAME -c <command>
The <command>자체를 다음과 같이 사용합니다.sudo sed -i 's|SEARCH_REGEX|REPLACEMENT|' /etc/cloud/cloud.cfg

REPLACEMENT하지만 스크립트를 실행할 때마다 해당 부분 으로 인한 것으로 보이는 오류가 발생합니다 .
캐리지 리턴이나 공백에 관한 것 같아요.

코드는 다음과 같습니다.

#!/bin/bash
$USERNAME="myusername"
$USERPWD="p@ssw0rd123"
PATTERN='s|preserve_hostname:\sfalse|preserve_hostname: true\nmanage_etc_hosts: false|'
su - $USERNAME -c 'sudo -S bash -c "sed -i '$PATTERN' /etc/cloud/cloud.cfg"' <<< $USERPWD

내가 얻는 오류는 다음과 같습니다.

 true\nmanage_etc_hosts:: -c: line 0: unexpected EOF while looking for matching `"'
 true\nmanage_etc_hosts:: -c: line 1: syntax error: unexpected end of file

나에게 도움이 된 자료:
https://linuxize.com/post/how-to-use-sed-to-find-and-replace-string-in-files/
https://linuxhint.com/50_sed_command_examples/

내가 뭘 잘못했나요?

답변1

@Quasimodo 덕분에 마침내 이 문제를 해결했습니다.

먼저 및 를 두 개의 다른 변수로 분할 PATTERN하여 가독성을 높였습니다. 그런 다음 기본적으로 내가 한 일은 작은 따옴표를 큰 따옴표로 또는 그 반대로 변경하는 것입니다.REGEXPREPLACEMENT

REGEXP="preserve_hostname:\sfalse"
REPLACEMENT="preserve_hostname: true\nmanage_etc_hosts: false"
PATTERN="s/$REGEXP/$REPLACEMENT/"
su - $USERNAME -c "sudo -S bash -c 'sed -n -i \"$PATTERN\" /etc/cloud/cloud.cfg'" <<< $USERPWD

$PATTERNsed 명령에서 큰따옴표를 이스케이프 처리했습니다.
그게 다야!

관련 정보