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バイト、文字列クラスタごとに1文字)、3つすべてが同じ結果を提供します。

答え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
$

注目すべき違いの1つは、折りたたむと出力に空白行が再現されることです。

$ 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
$ 

関連情報