대체 문자열 사용과 관련된 몇 가지 다른 질문을 조사했지만 sed
특정 요구 사항에 이를 적용하는 방법을 알 수 없습니다.
아래 코드 조각과 같은 경우 "#"으로 시작하지 않는 줄의 문자열만 변경하고 싶습니다.
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="string"
PKG_DESC="string-foo"
출력이 다음과 같기를 원합니다.
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="newString"
PKG_DESC="newString-foo"
제가 수집한 정보에 따르면 find 및 sed를 사용하여 모든 파일의 모든 문자열을 변경할 수 있다고 생각합니다.
find . -type f -exec sed -i 's/string/newString/g' {} +
하지만 "#"으로 시작하는 줄에 예외를 추가하는 방법을 알 수 없습니다. 저는 sed 외에 다른 방법도 열려 있으므로 더 쉬운 방법이 있으면 자유롭게 공유해 주세요.
읽고 나서여러 패턴과 일치하는 sed의 줄만 바꾸는 방법은 무엇입니까?, 줄이 특정 패턴으로 시작하면 문자열을 변경하는 방법을 배웠는데, 필요한 것은 패턴이 있는 줄을 변경하는 것입니다.아니요확립된.
답변1
sed
느낌표가 있는 패턴을 찾으면 실행을 중지할 수 있습니다.
sed '/#/!s/string/replacement/' file
즉, "#"(어디서나)과 일치하는 행에서는 교체가 수행되지 않습니다. 그렇지 않으면 교체가 수행됩니다. 귀하의 경우 결과는 다음과 같습니다.
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="replacement"
PKG_DESC="replacement-foo"
해시로 시작하는 줄만 건너뛰려면 정규식을 다음과 같이 변경하세요.
sed '/^#/!s/string/replacement/' file
끝에 주석이 있는 줄에는 주석 섹션에도 변경 사항이 적용되는 반면, 위의 예에서는 이러한 줄이 전혀 변경되지 않습니다(코드 섹션 포함).
답변2
#
문자가 없는 이 줄의 "문자열"을 변경하고 싶습니다.또는이 문자는 "문자열" 뒤에 오므로 줄 끝에 주석을 추가할 수 있습니다.
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="string"
PKG_DESC="string-foo"
PKG_A="string" # this is comment after string
올바른 작동을 위해
sed 's/^\([^#]*\)string/\1newString/' file
결과:
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="newString"
PKG_DESC="newString-foo"
PKG_A="newString" # this is comment after string