다음과 같은 문자열이 있습니다.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개만 있고test
3개 이상이 아닌 경우에 작동하는 것을 시도했습니다.
그것은 .*
탐욕스럽기 때문입니다. 즉, 가능한 한 모든 것과 일치할 것입니다. 예를 들어,
grep --color=always "b.*b" <<< abcabcabc
색상/처음부터 모든 것과 일치합니다.마지막 b
.