sed + 매개변수가 탭이나 공백으로 시작하더라도 줄의 시작 부분부터 매개변수를 주석 처리하는 방법

sed + 매개변수가 탭이나 공백으로 시작하더라도 줄의 시작 부분부터 매개변수를 주석 처리하는 방법

다음 파일이 있습니다

more /tmp/file
    number_of_cars_are=$number_of_cars_are
  LOG "number_of_cars_are=$number_of_cars_are"

echo "number_of_cars_are are $number_of_cars_are"

     grep number_of_cars_are /tmp/test 

&로 시작하는 줄 에만 주석을 달고 싶습니다 number_of_cars_are=. 해당 줄이 이미 주석이라면 sed는 이를 무시해야 합니다.

그래서 우리는 다음을 수행했습니다.

sed  '/^[^#].*^[[:space:]]*number_of_cars_are=/ s/^/#/' /tmp/file

그러나 number_of_cars_are=$number_of_cars_are 줄은 동일하게 유지됩니다.

기대되는 성과

more /tmp/file
#    number_of_cars_are=$number_of_cars_are
  LOG "number_of_cars_are=$number_of_cars_are"

echo "number_of_cars_are are $number_of_cars_are"

     grep number_of_cars_are /tmp/test 

답변1

줄을 일치시키는 데 사용하는 정규식에는 두 개의 줄 시작 앵커( ^)가 있으므로 두 번째 앵커는 실제 ^기호에만 일치합니다. ^before 를 제거하면 [[:space:]]표현식은 일치하지만 일치 항목이 너무 많습니다.

#    number_of_cars_are=$number_of_cars_are
#  LOG "number_of_cars_are=$number_of_cars_are"

LOG "일치 .*하므로 허용됩니다. 표현식의 시작 부분을 제거하겠습니다.

sed  '/^[[:space:]]*number_of_cars_are=/ s/^/#/'

이는 공백 문자(없음 포함)로 시작하고 그 뒤에 오는 모든 행과 일치합니다 number_of_cars_are=. 이에 의해 주석 줄은 일치하지 않으므로 다시 처리되지 않으며, 로 바로 시작하는 줄이 number일치됩니다.

관련 정보