sed
구성 파일에서 검색 및 바꾸기를 수행하는 데 문제가 있습니다.
-e
여러 명령을 사용하고 옵션을 사용하여 다음을 수행하고 싶습니다 .
DBName=.*
1단계: 파일에서 첫 번째로 나타나는 줄을 찾아 다음으로 바꿉니다.DBName=localhost
DBName=.*
존재하지 않는 경우- 2단계:
# DBNAME=.*
파일에서 처음 나타나는 줄을 찾아 문자열 아래에 줄을 삽입합니다.DBName=localhost
- 2단계:
# DBNAME=.*
존재하지 않는 경우- 3단계:
DBName=localhost
파일 하단에 삽입
- 3단계:
구문이 처음 등장했을 때 혼란스러웠습니다. 또한 #
문자열 뒤에 나오는 "공백"이 # 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
첫 번째 표현식과 동일한 작업을 수행합니다. 그렇지 않다면... - ...이것제삼표현식이 처리됩니다. 명령 문자열을 사용하여
$
파일의 마지막 줄( ) 에 문자열을 추가합니다 .a
DBName=localhost
답변2
sed -i 's/DBName=.\*/DBName=localhost/g' -e 's/\# DBNAME=.*/DBName=localhost/g' config_file
처음 두 가지 조건을 충족합니다.