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