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。
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上(因此每个字符一个字节,每个字素簇一个字符),所有三个都会给出相同的结果。
如果你的盒子里有perl6:
$ perl6 -e 'for @*ARGS -> $w { .say for $w.comb }' 'c??ng'
c
?
?
n
g
Run Code Online (Sandbox Code Playgroud)
无论您的语言环境如何都可以工作。
您可以使用该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)