문자열을 한 줄에 여러 문자로 나누는 방법을 알아내려고 합니다.
지금 바로 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
이 예제가 작동하는 이유는 다음과 같습니다 &
. &
검색되고 바뀌는 것은 정규식과 일치하는 문자입니다. 그래서 모든 것이아니요\n
A.
예
$ echo "123 abc" | sed 's/[0-9]*/&&/'
123123 abc
첫 번째는 &
패턴( )과 일치하는 문자를 인쇄합니다. 두 번째로 인쇄하십시오.[0-9]*
123
&
$ echo "123 abc" | sed 's/ab/&&&/'
123 abababc
우리가 찾고 있는 패턴은 입니다 ab
. 우리가 걷는 동안 문자열 123 abc
sed는 일치하지 않는 문자를 인쇄하고 있습니다 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//'