다음 파일이 있습니다.
fff
ff
test 23 34 \
45 44
rrr
bbb
이 파일에서 일치하는 줄을 제거하고 싶지만 test
줄 바꿈을 이스케이프하여 줄이 계속되고 \
다음 줄은 해당 줄에 속하는 것으로 간주되어야 합니다.
내가 명령을 실행하면
sed "/test/Id" file
test
해당 행에 속하는 다음 행을 포함하는 행만 삭제됩니다 .
\
-continued 그룹에 속한 모든 행을 삭제하는 방법은 무엇입니까 ?
답변1
test
일치 후 패턴 끝에 a가 더 이상 없을 때까지 줄을 누적한 다음 패턴 공간을 삭제하는 루프를 입력합니다 .\
$ sed '/test/{:a; /\\$/N; ta; d;}' file
fff
ff
rrr
bbb
답변2
에서 이 작업을 수행하는 방법을 모르지만 sed
다음 awk
프로그램은 작동해야 합니다.
awk 'f{f--} /test/{f=1} (f && /\\$/){f=2} !f' file.txt
f
현재 줄이 패턴과 일치하면 플래그가 1로 설정됩니다.- 이 플래그가 설정되고 행이 a로 끝나는 경우 2
\
로 증가됩니다f
. f
현재 행은 평가 결과가 0(즉, true)인 경우에만 인쇄됩니다!f
.- 플래그가 줄의 시작 부분에 설정되면 1씩 감소됩니다. 그래서,선험적으로직접 일치하는 행만 삭제됩니다. 개행으로 인해 증가하면
f
현재 줄은 여전히 제외된 것으로 표시됩니다.2
해당 줄도 계속되면 다음 줄도 계속 표시되도록f
다시 설정됩니다 .2
노트불행하게도 이는 일치하는 패턴이 다음 위치에 있는 경우에만 작동합니다.첫 번째그룹을 계속하는 라인.
답변3
GNU 사용sed
$ sed -Ez 's/test[^\n]*(\n|\\\n[^\n]*\n)//' input_file
fff
ff
rrr
bbb