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旨在按字符中断,但 GNUfold不支持多字节字符,因此它按字节中断:

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

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

答案3

如果你有perl6在你的盒子里:

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

相关内容