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가 대체하는 기본 구분 기호 문자 와 같이 명령 key
에 sed
특별한 의미를 갖는 문자가 변수에 포함되어 있지 않은지 확인해야 합니다 . /
이 경우 이와 같은 다른 문자를 사용할 수 있습니다 "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
.