如何拆分单词的字母,每个字母在单独的行中?
例如,假设"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
$