내 접근 방식에서는 문자를 문자열로 분리해야 한다고 주장합니다. 작업 방법을 찾았지만 이해할 수 없습니다.

내 접근 방식에서는 문자를 문자열로 분리해야 한다고 주장합니다. 작업 방법을 찾았지만 이해할 수 없습니다.

문자열을 한 줄에 여러 문자로 나누는 방법을 알아내려고 합니다.
지금 바로 ahebhaaa:

a  
h  
e  
b  
h  
a  
a  
a  

나는 시도했다:

$ echo ahebhaaa | sed 's/\(.\)\(.\)/\1\n\2/g'
즉, 내 의도는 캡처 그룹을 사용하여 문자 사이에 새 줄을 "삽입"하는 것이지만 다음과 같은 결과를 얻습니다.

a  
he  
bh  
aa  
a   

나는 이것이 탐욕스러운/비탐욕적인 것과 관련이 있다고 생각하지만 거기에 ?*를 추가하는 것은 아무 일도 하지 않습니다. 내가 여기서 뭘 잘못하고 있는 걸까?

또한 나는 이것을 발견했습니다:
echo ahebhaaa | sed 's/[^\n]/&\n/g'
일을 합니다. 그러나 나는 그것이 어떻게 작동하는지 이해하지 못합니다. 무엇인가요 &? 일하는 방법 [^\n]?

답변1

캡처 그룹

첫 번째 예는 비슷하지만 sed한 번에 2자를 사용하고 \(.\)\(.\)캡처 그룹을 사용하여 수행하려면 다음과 같이 조정할 수 있습니다.

$ echo ahebhaaa | sed 's/\(.\)/\1\n/g'
a
h
e
b
h
a
a
a

사용&

sed이 예제가 작동하는 이유는 다음과 같습니다 &. &검색되고 바뀌는 것은 정규식과 일치하는 문자입니다. 그래서 모든 것이아니요\nA.

$ echo "123 abc" | sed 's/[0-9]*/&&/'
123123 abc

첫 번째는 &패턴( )과 일치하는 문자를 인쇄합니다. 두 번째로 인쇄하십시오.[0-9]*123&

$ echo "123 abc" | sed 's/ab/&&&/'
123 abababc

우리가 찾고 있는 패턴은 입니다 ab. 우리가 걷는 동안 문자열 123 abcsed는 일치하지 않는 문자를 인쇄하고 있습니다 123. 그런 다음 ab검색하고 바꾸는 내용과 일치하는 문자열을 만나게 됩니다. 그런 다음 sed이를 일치하는 콘텐츠의 복사본 3개( )로 바꿉니다 abbab. 마지막으로 sed인쇄하세요 c.

이 기호는 [^\n]다음 세트를 생성합니다.아니요줄 끝 문자. 그렇다면 sed텍스트 문자열을 따라 이동하면서 ahebhaaa각 문자를 테스트하고 "이것은 하나가 아닙니다 \n"라고 말하는 것을 상상해 보십시오. 줄 끝 문자가 아닌 경우 sed이 문자에 대해 검색 및 바꾸기가 수행되고 &일치 항목(즉, 해당 문자)이 개행 문자와 함께 인쇄됩니다. 그런 다음 ahebhaaa로프를 따라 걷는 동안 이것을 반복합니다.

인용하다

답변2

이 예에서 \n이 작동하는 이유를 이해할 수 없습니다. 단일 줄 패턴 공간 케이스이므로 개행 문자가 없기 때문입니다. 따라서 이것으로 충분합니다:

sed 's/./&\n/g'

답변3

Perl의 대안

echo "abcdefg"|perl -nle 'print for split//'

관련 정보