sed에서 여러 명령을 사용하여 특수 문자가 포함된 문자열 뒤에 텍스트 삽입

sed에서 여러 명령을 사용하여 특수 문자가 포함된 문자열 뒤에 텍스트 삽입

sed구성 파일에서 검색 및 바꾸기를 수행하는 데 문제가 있습니다.

-e여러 명령을 사용하고 옵션을 사용하여 다음을 수행하고 싶습니다 .

  • DBName=.*1단계: 파일에서 첫 번째로 나타나는 줄을 찾아 다음으로 바꿉니다.DBName=localhost
  • DBName=.*존재하지 않는 경우
    • 2단계: # DBNAME=.*파일에서 처음 나타나는 줄을 찾아 문자열 아래에 줄을 삽입합니다.DBName=localhost
  • # DBNAME=.*존재하지 않는 경우
    • 3단계: DBName=localhost파일 하단에 삽입

구문이 처음 등장했을 때 혼란스러웠습니다. 또한 #문자열 뒤에 나오는 "공백"이 # DBNAME=나를 혼란스럽게 합니다.

답변1

이것을 사용하십시오 :

sed -e '/^DBName=.*/{s/^DBName=.*/DBName=localhost/;:a;n;ba;q}' \
  -e '/^# DBName=.*/{a \DBName=localhost
  :a;n;ba;q}' -e '$a \DBName=localhost' file

어디:

  • 이것첫 번째 -e명령문은 ^DBName=.*( ^줄의 시작 부분부터) 검색하고, 발견되면 {}괄호 안의 부분을 실행합니다. 이는 문자열을 검색하고 바꾸고, 완료되면 :a라는 레이블을 설정하고 a, n패턴 공간에서 다음 줄을 읽고 인쇄합니다. . 라벨 ba로 돌아가기 a이로 인해 sed나머지 모든 줄은 영향을 받지 않고 인쇄됩니다. 이 시점에서 sed명령이 종료 q되고 다른 표현식은 처리되지 않습니다. 따라서 교체는 한 번만 수행하면 됩니다.
  • 이것두번째표현식은 다음 줄로 시작하는 줄을 검색 # DBName=.*하고, 발견되면 다음 줄에 a추가됩니다 . 명령 뒤에는 아무 것도 없어야 하므로 DBName=localhost명령에 개행 문자가 필요합니다 . a추가한 후에는 :a;n;ba;q첫 번째 표현식과 동일한 작업을 수행합니다. 그렇지 않다면...
  • ...이것제삼표현식이 처리됩니다. 명령 문자열을 사용하여 $파일의 마지막 줄( ) 에 문자열을 추가합니다 .aDBName=localhost

답변2

sed -i 's/DBName=.\*/DBName=localhost/g' -e 's/\# DBNAME=.*/DBName=localhost/g' config_file

처음 두 가지 조건을 충족합니다.

관련 정보