数字または他の文字の間ではなく、文字間にのみスペースを挿入しようとしています。
hello woRLd 12ab34
しなければならないh e l l o w o R L d 12a b34
sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/g' file.txt
明らかにするh el lo w or LD 12a b34
次の文字も文字であることを確認しないため、各文字の後にスペースを挿入することはできません。
コマンドを2回実行するとsed
問題は解決しますが、エレガントではありません。可能であれば、この問題を解決するために使用する必要がありますsed
。
答え1
ループ+条件付き分岐を使用して実行できます。
$ echo "hello woRLd 12ab34" | sed '
:a
s/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/
ta
'
h e l l o w o R L d 12a b34
またはよりコンパクト
$ echo "hello woRLd 12ab34" | sed -e :a -e 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/' -e ta
h e l l o w o R L d 12a b34
答え2
コマンドを2回実行する必要はなく、スクリプトで代替コマンドを2回実行するだけですsed
。これを行う優雅な方法があります。空のパターンは前のパターンを繰り返します。s
sed
sed
//
sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/g;s//\1 \2/g' file.txt
読みやすくするために拡張正規表現を使用することをお勧めします。
sed -E 's/([a-zA-Z])([a-zA-Z])/\1 \2/g;s//\1 \2/g' file.txt
答え3
次のように正規表現が必要です。視野。残念ながらsed
ツアーをサポートしていません。だからあなたは使用する必要があります真珠
$ echo "hello woRLd 12ab34" | perl -pe 's/([a-zA-Z])(?=[a-zA-Z])/\1 /g'
h e l l o w o R L d 12a b34
$ perl -pe 's/([a-zA-Z])(?=[a-zA-Z])/\1 /g' file.txt
h e l l o w o R L d 12a b34
perl -pne
処理する必要がある複数の入力行があり、perl -i -pe
ファイルが適切に編集されている場合は、次のようにします。