배경
/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}