sed + 대괄호 안의 문자열을 키로 교체

sed + 대괄호 안의 문자열을 키로 교체

sed를 사용하여 [….]의 내용을 대상으로 바꾸고 싶습니다.key=new_string

more /tmp/file
my.uri=http://[linux123]:8080

이것을 시도해 보자

key=new_string

sed  s"/\[*\]/$key/g" /tmp/file

하지만 파일은 변경되지 않았습니다.

more file
my.uri=http://[linux123]:8080

내 sed에 문제가 있나요?

예상되는 결과는 다음과 같습니다(대괄호 제외).

more file
my.uri=http://new_string:8080

답변1

먼저, sed가 대체하는 기본 구분 기호 문자 와 같이 명령 keysed특별한 의미를 갖는 문자가 변수에 포함되어 있지 않은지 확인해야 합니다 . /이 경우 이와 같은 다른 문자를 사용할 수 있습니다 "s@pattern@replacement@g" file.

그런 다음 여는 괄호와 해당하는 닫는 괄호를 일치시켜야 합니다. 즉, \[.*\]sed는 탐욕스럽습니다. 행에 가 포함되어 있으면 [text1] text2 [text3]sed는 모두 일치합니다. 따라서 .*오른쪽 대괄호가 아닌 문자를 0번 이상 정의해야 합니다 [^]]*.

위에서는 캐럿( ) 뒤에 최소한 하나의 문자가 제외될 때까지 기다리기 \]때문에 중간 괄호( )를 이스케이프 처리 할 필요가 없으므로 목록의 닫는 괄호에 의해 제외된 문자로 잘못 읽히지 않습니다. , 그러나 리터럴 대괄호로 사용됩니다.sed^

이제 변경 사항을 적용하려면 -i아래에 설명된 방법을 사용할 수 있습니다.우편 엽서. 하지만 먼저 테스트하지 않고 -i출력의 일부를 확인하고 좋아 보이는지 확인하세요.

따라서 이것은 sed귀하의 경우에 작동할 것으로 예상됩니다.

sed -i "s/\[[^]]*\]/$key/g" file

답변2

정규식에 "*" 앞에 "."가 없습니다. 여는 괄호와 닫는 괄호가 하나만 있다고 확신하는 경우 다음과 같이 작동합니다.

sed "s/\[.*\]/$key/g" /tmp/file

이는 표준 출력으로 인쇄합니다. 제자리에서 편집하려면 를 사용하십시오 sed -i.

관련 정보