특정 줄 뒤의 문자열 바꾸기

특정 줄 뒤의 문자열 바꾸기

"task Listen" 문자열이 포함된 줄 뒤의 "edit TRIES 2" 문자열을 "edit TRIES 3"으로 바꾸고 싶습니다.

  task Listen
    edit TRIES 2

sed를 사용하여 이 작업을 어떻게 수행할 수 있나요? "edit TRIES 2"라는 문자열이 파일에 여러 번 나타나므로 해당 특정 줄을 바꾸려고 하므로 간단한 sed 교체를 수행할 수 없습니다.

답변1

좀 더 간단한 건 어때요?

sed '/task Listen/{n; s/edit TRIES 2/edit TRIES 3/}' file

전임자. 주어진

$ cat file
    edit TRIES 2
    edit TRIES 2
  task Listen
    edit TRIES 2
    edit TRIES 2

그 다음에

$ sed '/task Listen/{n; s/edit TRIES 2/edit TRIES 3/}' file
    edit TRIES 2
    edit TRIES 2
  task Listen
    edit TRIES 3
    edit TRIES 2

답변2

또는 스크립트 가능한 편집기를 사용하십시오 ed. "Task Listen"이 포함된 행을 검색하고 그 이상으로 이동하여 "edit TRIES 2"를 "edit TRIES 3"으로 바꾸십시오.

printf '%s\n' '/task Listen/+1 s/edit TRIES 2/edit TRIES 3/' 'wq' | ed -s file

printf개행으로 구분된 두 개의 명령을 다음으로 보냅니다 ed(진단을 억제하라는 메시지가 표시됨 -s).

  1. /task Listen/+1-- "task Listen"과 일치하는 아래 항목에서,
  2. s/edit TRIES 2/edit TRIES 3/-- "edit TRIES 2"를 "edit TRIES 3"으로 대체합니다.

"task Listen" 다음 줄이아니요"edit TRIES 2"를 포함하면 ed실패합니다(파일은 변경되지 않은 상태로 유지됩니다).

답변3

내 시도는 다음과 같습니다.

sed -E 'N;s/([[:blank:]]*task Listen\n[[:blank:]]*edit TRIES )[0-9]*)/\13/' file

확장된 정규식을 사용하십시오:

sed -E

명령 사용 N(줄 바꿈)

'N;

공백이나 탭으로 시작하는 경우 반복되는 두 줄을 일치시키고 캡처합니다.

([[:blank:]]*task Listen\n[[:blank:]]*edit TRIES )[0-9]*

이 경우 문자열을 캡처된 패턴과 원하는 문자열로 바꿉니다 3.

/\13/

답변4

다음 명령을 사용해보십시오. 훌륭하게 작동합니다.

주문하다

sed -n '/task Listen/,+1p' filename| sed "s/edit TRIES 2/edit TRIES 3/g"

산출

task Listen
    edit TRIES 3

관련 정보