"sed"를 사용하여 문자열에서 "=" 기호 뒤에 값을 추가하려면 어떻게 해야 합니까?

"sed"를 사용하여 문자열에서 "=" 기호 뒤에 값을 추가하려면 어떻게 해야 합니까?

배경

/etc/default/hostapd다음 문자열을 가져오고 그 뒤에 값을 추가하고 싶습니다 =.

#DAEMON_CONF=""->DAEMON_CONF="/etc/hostapd/hostapd.conf"

시험

un_comment_and_add_value() {
       file="$1"
       given_str="$2" ##DAEMON_CONF=""
       value="$3" # /etc/hostapd/hostapd.conf
                  #dont know where to put this in the 'sed' cmd

       sed -i "/$given_str/s/^#//g" "$file"
}

un_comment_and_add_value "/etc/default/hostapd" "#DAEMON_CONF=\"\"" "/etc/default/hostapd"

답변1

주어진 예에서 다음을 시도하십시오.

sed -i "/^$given_str/{s/.//; s|.$|$value\"|}" "$file"
  • 변수 보간을 허용하려면 큰따옴표를 사용하세요.
  • /^$given_str/주어진 문자열이 줄의 시작 부분과 일치하는 경우
    • s/.//첫 번째 문자 삭제
    • s|.$|$value\"|마지막 문자를 주어진 대체 문자열과 큰따옴표로 바꿉니다.

추가 자료:

답변2

$ cat input
#DAEMON_CONF=""
$ key=DAEMON_CONF
$ value="/etc/hostapd/hostapd.conf"

$ sed "/^$key/ { s/^#//; s%=.*%=\"$value\"%; }" input
DAEMON_CONF="/etc/hostapd/hostapd.conf"

여기에는 두 가지가 있습니다. 먼저, 쉘 변수를 확장하려면 작은따옴표가 아닌 큰따옴표로 묶어야 합니다. 둘째, 패턴 일치에 의존하도록 대체 항목을 그룹화해야 합니다. (또는 각 패턴 앞에 일치하는 패턴을 복사합니다 s///.) 세 번째, 대체 항목에 슬래시가 포함되어 있으므로 s여기에서는 백분율 기호와 같은 다른 문자를 구분 기호로 사용하는 것이 좋습니다.

변수에 백분율 기호가 포함되어 있지 않은지 확인해야 합니다 value. sed 명령에 리터럴이나 백슬래시를 삽입해야 하는 경우 $쉘이 백슬래시 내에서 처리하므로 이를 이스케이프해야 합니다.

그렇다면 다음 사항도 고려해 볼 수 있습니다. "sed" 대체에 삽입된 문자열이 모든 메타 문자를 이스케이프하는지 확인하는 방법

답변3

아래 sed 명령을 통해 이 작업을 수행했습니다. 질문이 있으면 알려주세요.

얻은 입력 파일은 다음과 같습니다

고양이/etc/기본/hostapd

#DAEMON_CONF=""

주문하다:

sed -i '/#DAEMON_CONF/s/^#//g' /etc/default/hostapd ; sed -i 's/"/&\/etc\/hostapd\/hostapd.conf/1' /etc/default/hostapd 

산출

DAEMON_CONF="/etc/hostapd/hostapd.conf"

답변4

다음과 같이 사용할 수 있습니다.

sed -i /etc/default/hostapd -e '/^#DAEMON_CONF=/s;^#\([^=]*\)=.*;\1='"${VALUE}"';'

  • -i그 자리에서 파일 편집
  • /etc/default/hostapd편집할 파일
  • /^#DAEMON_CONF=/필터 라인은 다음으로 시작합니다.#DAEMON_CONF=
  • s;바꾸다
  • ^#\([^=]*\)=.*;전체 줄을 바꾸되 변수 이름, 사이에 있는 문자열, #즉 까지 기억하세요 =. 이 경우 DAEMON_CONF
  • \1=${VALUE}라인을 다음으로 교체하십시오.${remembered variable name}=${VALUE}

관련 정보