일치 후에만 하나의 유사한 행을 바꾸는 방법

일치 후에만 하나의 유사한 행을 바꾸는 방법

특정 항목을 검색하고 [7_addons]다음 항목만 바꾸려고 합니다.enabled=0enabled=1

이 예에서는 다음과 같습니다.

sed -i -e 's#enabled=0#enabled=1#g' /etc/file.txt

enabled=0..replace 에 표시된 모든 내용 이지만 검색 문자열 뒤에 오는 내용만 바꾸고 로 바꾸고 중지 file.txt하고 싶습니다 .7_addons=0=1

답변1

enabled첫 번째 줄 이후에 존재한다고 가정되는 파일의 줄을 바꾸려면 ed![7_addons]

ed -s input <<< $'/^\[7_addons\]$\n/^enabled=0\nc\nenabled=1\n.\nw\nq' > /dev/null

외부에서 시작하여 파일 ed의 스크립트 모드에서 실행되어 inputANSI 인용 문자열을 here 문자열로 전달한 다음 출력을 /dev/null로 리디렉션합니다. /dev/null 리디렉션은 작업을 수행하는 동안 발견된 행에 대한 보고서를 삭제합니다.

여기의 문자열은 \n-로 구분된 다음 명령으로 구분됩니다.

  1. /^\[7_addons\]$-- 줄의 [7_addons]시작( ^)과 끝( ) 에서 정확하게 줄을 검색합니다.$
  2. /^enabled=0$--그 다음에다음 행을 앞으로 검색합니다.enabled=0
  3. c-- 이 줄을 바꾸세요
  4. enabled=1——이 기사의 경우
  5. .-- 대체 텍스트 끝
  6. w--디스크에 파일 쓰기
  7. q——편집 종료

이 예시 입력에서는 다음과 같습니다.

[1_addons]
enabled=0
foo=bar
[7_addons]
foo=baz
enabled=0
other=bat
[8_addons]
foo=quux

생성된 파일은 다음과 같습니다.

[1_addons]
enabled=0
foo=bar
[7_addons]
foo=baz
enabled=1
other=bat
[8_addons]
foo=quux

답변2

sed '/\[7_addons\]/{n;s/enabled=0/enabled=1/}'

[7_addons]또는 와 사이에 다른 줄이 있는 경우 enabled=0:

sed '/\[7_addons\]/,/enabled=/s/enabled=0/enabled=1/'

예:

$ cat foo
[2_foo]
enabled=0
[7_addons]
extra fluff
enabled=0
enabled=0
$ sed '/\[7_addons\]/,/enabled=/s/enabled=0/enabled=1/' foo
[2_foo]
enabled=0
[7_addons]
extra fluff
enabled=1
enabled=0

정규식을 좀 더 엄격하게 만들고 싶을 수도 있습니다. 질문의 데이터를 기반으로 그렇게 할 수는 없습니다.

관련 정보