sed를 사용하여 두 단어 사이의 모든 내용을 삭제하시겠습니까?

sed를 사용하여 두 단어 사이의 모든 내용을 삭제하시겠습니까?

이것작동하지 않는 것 같습니다

The next example would delete everything between "ONE" and "TWO:" 

#!/bin/sh
sed '
/ONE/ {
# append a line
    N
# search for TWO on the second line 
    /\n.*TWO/ {
# found it - now edit making one line
        s/ONE.*\n.*TWO/ONE TWO/
    }
}' file

1과 2 사이의 모든 것을 삭제하고 싶었습니다. 포함된 파일을 사용해 보았습니다.

[user5@mailserver ~]$ cat file
ONE
hello
TWO

그러나 출력은 다음과 같습니다

[user5@mailserver ~]$ ./test
ONE
hello
TWO

ONE TWO 나는 그것을 바로잡으려고 노력할 것이라고 생각했지만 그럴 수 없었다.

답변1

이것이 일을 할 것이다

sed '/^ONE/,/TWO/{/^ONE/!{/TWO/!d}}' file

/^ONE/,/TWO/ONEup으로 시작하는 첫 번째 줄을 보세요 .TWO

{/^ONE/!내 줄이 다음으로 시작하지 않는 경우ONE

{/TWO/!d}}내 줄이 TWO다음으로 시작하지 않고 다음을 수행하는 경우delete

위의 내용을 요약하면 다음과 같습니다.

ONEup 으로 시작하는 모든 것을 찾아보세요 TWO. 또 다른 확인을 실행합니다. 즉, "ONE TWO"와 일치하지 않는 항목을 찾아 and나머지를 삭제합니다.

답변2

나는 사용할 것이다

sed 'N;N;s/ONE.*\n.*TWO/ONE TWO/' file

이 두 작업은 작업이 작동할 N수 있도록 세 행을 함께 연결합니다 .s

(이것은 또한 원래 예와 매우 유사합니다).

관련 정보