Bash 스크립트: 각 문자로 단어 분할

Bash 스크립트: 각 문자로 단어 분할

각 문자가 별도의 줄에 있도록 단어의 문자를 분할하는 방법은 무엇입니까?

"StackOver" 예를 들어 보고 싶다고 해보자.

S
t
a
c
k
O
v
e
r

저는 bash를 처음 접해서 어디서부터 시작해야 할지 모르겠습니다.

답변1

나는 다음을 사용할 것이다 grep:

$ grep -o . <<<"StackOver"
S
t
a
c
k
O
v
e
r

또는 sed:

$ sed 's/./&\n/g' <<<"StackOver"
S
t
a
c
k
O
v
e
r

후행 공백이 문제인 경우:

sed 's/\B/&\n/g' <<<"StackOver"

이 모든 것은 GNU/Linux를 가정합니다.

답변2

텍스트를 세로로 인쇄하려는 경우 문자가 아닌 문자소 클러스터에서 중단하는 것이 좋습니다. 예를 들어, e날카로운 악센트가 있는 a는 다음과 같습니다.

  • 문자소 클러스터( e그리고 날카로운 악센트는하나자소 클러스터):

    $ perl -CLAS -le 'for (@ARGV) {print for /\X/g}' $'Ste\u301phane'
    S
    t
    é
    p
    h
    a
    n
    e
    

    (또는 grep -Po '\X'PCRE 지원과 함께 GNU grep을 사용하십시오)

  • 문자 사용(여기서 GNU grep):

    $ printf '%s\n' $'Ste\u301phane' | grep -o .
    S
    t
    e
    
    p
    h
    a
    n
    e
    
  • fold문자 단위로 나누는 것을 목표로 하지만 GNU는 fold멀티바이트 문자를 지원하지 않으므로 바이트 단위로 나눕니다.

    $ printf '%s\n' $'Ste\u301phane' | fold -w 1
    S
    t
    e
    p
    h
    a
    n
    e
    

존재하다스택 오버플로ASCII 문자로만 구성되므로(즉 문자당 1바이트, 문자소 클러스터당 1문자) 세 가지 모두 동일한 결과를 제공합니다.

답변3

당신이 가지고 있다면펄6상자 안에:

$ perl6 -e 'for @*ARGS -> $w { .say for $w.comb }' 'cường'       
c
ư
n
g

귀하의 지역에 관계없이 작동합니다.

답변4

당신은 그것을 사용할 수 있습니다fold (1)주문하다. grep및 보다 효율적 입니다 sed.

$ time grep -o . <bigfile >/dev/null

real    0m3.868s
user    0m3.784s
sys     0m0.056s
$ time fold -b1 <bigfile >/dev/null

real    0m0.555s
user    0m0.528s
sys     0m0.016s
$

주목할만한 차이점 중 하나는 접으면 출력에 빈 줄이 재생산된다는 것입니다.

$ grep -o . <(printf "A\nB\n\nC\n\n\nD\n")
A
B
C
D
$ fold -b1 <(printf "A\nB\n\nC\n\n\nD\n")
A
B

C


D
$ 

관련 정보