해당 특정 줄에 대한 개행을 제거하면서 전체 줄을 대체합니다.

해당 특정 줄에 대한 개행을 제거하면서 전체 줄을 대체합니다.

sed특정 단어가 포함된 전체 줄을 (로) 바꾸려고 합니다.그리고끝에 개행 문자가 있습니다. 테스트 파일은 다음과 같습니다.

this # target for substitution
this is a test
another test?

지금 나 한테있어풀어 주다여기에서 그리고 여기에서연결됨Post, 어떻게든 이 작업을 수행하는 방법을 이해합니다.

sed 's/^this$/test/g' testfile

이것은 효과가 있거나 적어도 그렇게 보입니다.왜냐하면단어 끝의 개행 문자 this는 그대로 유지됩니다.

test # target for substitution but newline is still there
this is a test
another test?

위의 내용을 보면 나는 완전히알고 있는 sed개행 문자를 직접적으로 일치시킬 수 있는 방법은 없습니다(비록 일부 버전에서는 '\n'을 사용할 수 있다는 것을 기억 sed하지만 이것이 요점은 아닙니다).

나는 최소한 전체 단어/줄 및 개행 문자를 제거하는 방법을 알고 있습니다.

sed '/^this$/d' testfile

하지만 대신 사용해야 해요.

어떻게 해야 하나요? ( sed최대)

답변1

this내가 이해하는 바에 따르면, 단어와 개행 문자로만 구성된 줄을 바꾸고 싶기 test때문에

foo
this
this is a test

되어야 한다

foo
testthis is a test

sed다음 줄에 합류 하고 N개행 문자 앞의 모든 내용을 바꾸면 됩니다.

sed '/^this$/{N;s/.*\n/test/;}'

답변2

여기에서 사용하는 것이 좋습니다. 구문은 perl이 예와 다르지 않습니다.sed

$ cat ip.txt
this
this is a test
another test?

$ perl -pe 's/^this\n/XYZ/' ip.txt
XYZthis is a test
another test?

답변3

GNU sed를 사용하면 모든 줄을 메모리로 읽어서 -z거기에서 일치시킬 수 있습니다. 예를 들면 다음과 같습니다.

sed -z 's/this\n/test/'

답변4

awk를 사용하는 한 가지 방법은 다음을 조작하여 레코드 구분 기호를 출력하는 것입니다.

$ awk '{ ORS = sub(/^this$/,"FOO") ? "" : RS }1' file

$ sed -e '
    $!N
    s/^this\n/FOO/;t
    P;D
' file

관련 정보