Bash 脚本:在每个字母上拆分单词

Sij*_*lak 21 command-line split words

如何拆分单词的字母,每个字母在单独的一行中?

例如,鉴于"StackOver" 我想看到

S
t
a
c
k
O
v
e
r
Run Code Online (Sandbox Code Playgroud)

我是 bash 新手,所以我不知道从哪里开始。

jim*_*mij 32

我会用grep

$ grep -o . <<<"StackOver"
S
t
a
c
k
O
v
e
r
Run Code Online (Sandbox Code Playgroud)

sed

$ sed 's/./&\n/g' <<<"StackOver"
S
t
a
c
k
O
v
e
r
Run Code Online (Sandbox Code Playgroud)

如果最后的空白是一个问题:

sed 's/\B/&\n/g' <<<"StackOver"
Run Code Online (Sandbox Code Playgroud)

所有这些都假设 GNU/Linux。

  • @SijaanHallak 这就是所谓的`Here string`,相当于`echo foo |的grosso modo ...` 只是少打字。见 http://www.tldp.org/LDP/abs/html/x17837.html (3认同)

Sté*_*las 20

如果意图是垂直打印文本,您可能希望打破字素簇而不是字符。例如带有e尖锐口音的 a:

  • 使用字形簇(e带有尖锐重音的字形簇将是一个字形簇):

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

    (或grep -Po '\X'使用 PCRE 支持构建的 GNU grep)

  • 使用字符(此处使用 GNU grep):

    $ printf '%s\n' $'Ste\u301phane' | grep -o .
    S
    t
    e
    
    p
    h
    a
    n
    e
    
    Run Code Online (Sandbox Code Playgroud)
  • fold旨在中断字符,但 GNUfold不支持多字节字符,因此它改为中断字节:

    $ printf '%s\n' $'Ste\u301phane' | fold -w 1
    S
    t
    e
    ?
    ?
    p
    h
    a
    n
    e
    
    Run Code Online (Sandbox Code Playgroud)

在仅由 ASCII 字符组成的StackOver上(因此每个字符一个字节,每个字素簇一个字符),所有三个都会给出相同的结果。

  • @SijaanHallak 这些可能会有所帮助:http://www.joelonsoftware.com/articles/Unicode.html, http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/ (3认同)

cuo*_*glm 7

如果你的盒子里有perl6

$ perl6 -e 'for @*ARGS -> $w { .say for $w.comb }' 'c??ng'       
c
?
?
n
g
Run Code Online (Sandbox Code Playgroud)

无论您的语言环境如何都可以工作。


iru*_*var 6

有很多awk版本

awk -F '' -v OFS='\n' '{$1=$1};1' <<<'StackOver'
Run Code Online (Sandbox Code Playgroud)


小智 5

echo StackOver | sed -e 's/./&\n/g'
S
t
a
c
k
O
v
e
r
Run Code Online (Sandbox Code Playgroud)


joe*_*dle 5

您可以使用该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
$
Run Code Online (Sandbox Code Playgroud)

一个显着的区别是 fold 将在输出中重现空行:

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)