
文字列を1行に複数の文字に分割する方法を見つけようとしています。
今すぐahebhaaa
:
a
h
e
b
h
a
a
a
私は試した:
$ echo ahebhaaa | sed 's/\(.\)\(.\)/\1\n\2/g'
つまり、私の意図はキャプチャグループを使用して文字間に新しい行を「挿入」することですが、次のような結果が得られます。
a
he
bh
aa
a
私はこれが貪欲な/非欲望的なものと関係があると思いますが、そこに?*を追加することは何もしません。私がここで何を間違っているのか?
また私はこれを見つけました:
echo ahebhaaa | sed 's/[^\n]/&\n/g'
仕事をします。しかし、私はそれがどのように機能するのか理解していません。何ですか&
?働く方法[^\n]
?
答え1
キャプチャグループ
最初の例は似ていますが、sed
一度に2文字を使用して\(.\)\(.\)
キャプチャグループを使用して実行するには、次のように調整できます。
$ echo ahebhaaa | sed 's/\(.\)/\1\n/g'
a
h
e
b
h
a
a
a
使用&
sed
この例が機能する理由は次のとおりです&
。&
検索と変更は正規表現に一致する文字です。だからすべていいえ\n
A.
はい
$ echo "123 abc" | sed 's/[0-9]*/&&/'
123123 abc
最初は&
パターン()に一致する文字を印刷します。 2番目に印刷します。[0-9]*
123
&
$ echo "123 abc" | sed 's/ab/&&&/'
123 abababc
私たちが探しているパターンはですab
。私たちが歩いている間、文字列123 abc
sedは一致しない文字を印刷しています123
。その後、ab
検索して置き換える内容に一致する文字列に会います。その後、sed
それを一致するコンテンツの3つのコピー()に置き換えますabbab
。最後にsed
印刷してくださいc
。
このシンボルは[^\n]
次のセットを生成します。いいえ行末文字。その場合は、sed
テキスト文字列に沿って移動しながらahebhaaa
各文字をテストし、「これは1つではありません\n
」と言うことを想像してみてください。行末文字でない場合は、sed
この文字に対して検索と置換が行われ、一致&
(つまりその文字)が改行文字で印刷されます。その後、ahebhaaa
ロープに沿って歩きながらこれを繰り返します。
引用する
答え2
この例では、\ nが機能する理由を理解できません。単一行のパターン空間ケースなので改行文字がないからです。したがって、これで十分です。
sed 's/./&\n/g'
答え3
Perlの代替
echo "abcdefg"|perl -nle 'print for split//'