"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
).
/task Listen/+1
-- "task Listen"과 일치하는 아래 항목에서,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