sed를 만들거나 다른 명령을 사용하여 찾은 문자열을 다시 인쇄하는 방법은 무엇입니까?

sed를 만들거나 다른 명령을 사용하여 찾은 문자열을 다시 인쇄하는 방법은 무엇입니까?

다음과 같은 문자열이 있습니다.testfsdfsdftestfsdkflsdtestsdfsdfsdf

testfsdfsdf첫 번째 줄에 표시되고 두 번째 줄에 표시 되도록 문자열을 분리하는 방법이 궁금합니다 testfsdkflsd. 다음과 같습니다.

testfsdfsdf
testfsdkflsd
testsdfsdfsdf

sed찾기 위해 사용해 보았지만 test다시 sed 's/test.*/인쇄하는 방법이 궁금합니다 test.*. 내가 아는 바로는 sed이를 사용하여 특정 문자열을 찾은 다음 다른 문자열로 바꿀 수 있습니다. 따라서 기본적으로 와 같은 것을 시도하고 싶었지만 sed 's/test.*/[reprint test.* here]\n/g'그렇게 sed 's/test.*/test.*\n/g'하면 test.*. 로 찾은 문자열을 다시 인쇄할 수 있는 방법이 있습니까 sed? 아니면 다른 명령으로 이 작업을 수행할 수 있습니까?

나는 또한 sed 's/\(test.*\)test/\1\ntest/g'인스턴스가 2개만 있고 test[random characters]3개 이상이 아닌 경우에 작동하는 것을 시도했습니다. 문자열을 사용하면 testfsdfsdftestfsdkflsdtestsdfsdfsdf다음만 인쇄됩니다.

testfsdfsdftestfsdkflsd
testsdfsdfsdf

답변1

당신은 가깝습니다. 원하는 sed 명령은 다음과 같습니다.

sed 's/test/\ntest/g'

각각의 앞에 개행 문자를 추가합니다 test.

\n이제 GNU sed 및 다른 사람들이 이를 수행하지만 개행 문자로 의 해석은 다음에 의해 지정되지 않습니다.POSIX. 명령을 이식 가능하게 만들려면 리터럴 이스케이프된 개행 문자가 필요합니다.

sed 's/test/\
test/g'

test그러나 예제의 경우처럼 줄의 처음 4개 문자가 출력 시작 부분에 빈 줄을 생성한다는 것을 알 수 있습니다 . 그런 일이 발생하지 않으면 다음을 사용할 수 있습니다.

sed 's/\(.\)test/\1\ntest/g'

.어떤 문자와도 일치하므로 이전에 어떤 문자가 존재 test했다면필수의, 그렇지 않으면 정규식이 일치하지 않습니다. 즉, test가 줄의 첫 번째 문자열이면 .어떤 것과도 일치할 수 없으며 대체가 이루어지지 않습니다.

그리고 휴대용 대안의 경우,

sed 's/\(.\)test/\1\
test/g'

GNU sed를 사용한 일부 테스트:

$ sed 's/test/\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'

testfsdfsdf
testfsdkflsd
testsdfsdfsdf
$ sed 's/\(.\)test/\1\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'
testfsdfsdf
testfsdkflsd
testsdfsdfsdf

나는 또한 sed 's/\(test.*\)test/\1\ntest/g'의 인스턴스가 2개만 있고 test3개 이상이 아닌 경우에 작동하는 것을 시도했습니다.

그것은 .*탐욕스럽기 때문입니다. 즉, 가능한 한 모든 것과 일치할 것입니다. 예를 들어,

grep --color=always "b.*b" <<< abcabcabc

색상/처음부터 모든 것과 일치합니다.마지막 b.

관련 정보