回答:
私は使用します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を想定しています。
Here string
、grosso modoと同等のecho foo | ...
タイピングが少ないことと同じです。参照tldp.org/LDP/abs/html/x17837.html
.
する\B
(ワード境界に一致していません)。
sed
ように:sed -et -e's/./\n&/g;//D'
テキストを垂直に印刷することが意図されている場合は、文字ではなく書記素クラスターを分割することができます。たとえばe
、鋭アクセント付きのaの場合:
書記素クラスターの場合(e
その鋭いアクセントは1つの書記素クラスターになります):
$ 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
文字で改行することを意図していますfold
が、GNU はマルチバイト文字をサポートしていないため、代わりにバイトで改行します。
$ printf '%s\n' $'Ste\u301phane' | fold -w 1
S
t
e
�
�
p
h
a
n
e
上StackOver ASCII文字のみで構成されています(文字あたり1バイト、書記素クラスタごとに1つの文字に)、すべての3つは同じ結果を与えるだろう。
grep -Po
、人が期待するようなことをしないことに驚いています(そうするようにgrep -P
)。
grep -Po .
文字を検索し(改行文字に続く鋭角アクセントの組み合わせは無効です)、grep -Po '\X'
graphemクラスタを検索します。それが正常に動作(またはしようとするためにあなたは、最近のgrepのバージョンおよび/またはPCREが必要な場合がありますgrep -Po '(*UTF8)\X'
)
以下は一般的なものです:
$ awk -F '' \
'BEGIN { RS = ""; OFS = "\n"} {for (i=1;i<=NF;i++) $i = $i; print }' <file_name>
echo StackOver | sed -e 's/./&\n/g'
S
t
a
c
k
O
v
e
r
また、Pythonの2は、コマンドラインから使用することができます。
python <<< "for x in 'StackOver':
print x"
または:
echo "for x in 'StackOver':
print x" | python
または(1_CRのコメント通り)Python 3の場合:
python3 -c "print(*'StackOver',sep='\n')"
この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つは、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
$
次のようなマルチバイト文字を処理できます。
<input \
dd cbs=1 obs=2 conv=unblock |
sed -e:c -e '/^.*$/!N;s/\n//;tc'
あなたが作業しているときはかなり便利なことができ、ライブそこにはバッファリングはありませんし、すぐにそれがあるように、文字が印刷されるので、入力全体。
sed
がスクリプトの目的です。私は今についての1つを書く可能性はありません-私はかなり眠いです。しかし、端末を読むときは本当に便利です。
dd
マルチバイト文字が壊れるので、出力はテキストではなくなるので、sedの動作はPOSIXで規定されていないことに注意してください。
bashの場合:
これは任意のテキストで動作し、bashの内部のみ(外部ユーティリティは呼び出されません)で動作するため、非常に短い文字列では高速になります。
str="Stéphane áàéèëêếe"
[[ $str =~ ${str//?/(.)} ]]
(set -- "${BASH_REMATCH[@]:1}"; IFS=$'\n'; echo "$*")
出力:
S
t
é
p
h
a
n
e
á
à
é
è
ë
ê
ế
e
IFSを変更して位置パラメータを変更しても問題ない場合は、サブシェルの呼び出しを回避することもできます。
str="Stéphane áàéèëêếe"
[[ $str =~ ${str//?/(.)} ]]
set -- "${BASH_REMATCH[@]:1}"
IFS=$'\n'
echo "$*"
s=stackoverflow;
$ time echo $s | fold -w1
s
t
a
c
k
o
v
e
r
real 0m0.014s
user 0m0.000s
sys 0m0.004s
ここでの更新は、ハッキー|最速| pureBashBasedの方法です!
$ time eval eval printf \'%s\\\\n\' \\\${s:\{0..$((${#s}-1))}:1}
s
t
a
c
k
o
v
e
r
real 0m0.001s
user 0m0.000s
sys 0m0.000s
より素晴らしいために
function foldh ()
{
if (($#)); then
local s="$@";
eval eval printf \'%s\\\\n\' \\\"\\\${s:\{0..$((${#s}-1))}:1}\\\";
else
while read s; do
eval eval printf \'%s\\\\n\' \\\"\\\${s:\{0..$((${#s}-1))}:1}\\\";
done;
fi
}
function foldv ()
{
if (($#)); then
local s="$@";
eval eval echo \\\"\\\${s:\{0..$((${#s}-1))}:1}\\\";
else
while read s; do
eval eval echo \\\"\\\${s:\{0..$((${#s}-1))}:1}\\\";
done;
fi
}
fold -b1
ますか?