シェル芸botでそんな感じの処理について実行されてたので、どんな方法があるのか一通りまとめてみることにした。 とりあえず、GNU sedやperl、rubyなら正規表現の\Bがあるので、それを使えばいいだろう。
echo あいうえお | sed 's/\B/x/g'
echo あいうえお | perl -C -ple 'use utf8;s/\B/x/g'
echo あいうえお | ruby -ple '$_.gsub!(/\B/,"・")'
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | sed 's/\B/x/g'
あxいxうxえxお
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | perl -C -ple 'use utf8;s/\B/x/g'
あxいxうxえxお
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | ruby -ple '$_.gsub!(/\B/,"・")'
あ・い・う・え・お
一応、Pythonでもできなくはない(無理しないでも…と思うけど。pythonでやるならforの内包表記のがよさそう)。
printf aiueo | python -c 'import re;import sys;print re.sub("\B","x",sys.stdin.read())'
blacknon@BS-PUB-UBUNTU-01:~$ printf aiueo | python -c 'import re;import sys;print re.sub("\B","x",sys.stdin.read())'
axixuxexo
じゃ、正規表現で指定できない場合、例えばawkでならどうすればいいのかなーと思い、最初はスタンダードにforで処理するような書き方を考えていた。
echo あいうえお|awk -v FS='' '{for(i=1;i<=NF;i++)(x=="")?x=sprintf($i):x=x"x"sprintf($i);print x}'
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお|awk -v FS='' '{for(i=1;i<=NF;i++)(x=="")?x=sprintf($i):x=x"x"sprintf($i);print x}'
あxいxうxえxお
最初は「まあこんなものなのかな」とか思ってたのだけど、@ebanさんの書き方がすごく勉強になったので残しておく。
echo ソラノヲト | awk NF=NF FS= OFS=・#シェル芸
— eban (@eban) 2018年3月26日
- NF=NFで再構成
- FS= OFS=・で区切り文字の指定(この時、FSの指定では後ろに続く要素があるのであれば囲み文字は不要みたい)
echo あいうえお|awk 'NF=NF' FS='' OFS="x"
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお|awk 'NF=NF' FS='' OFS="x"
あxいxうxえxお
知らなかった(´・ω・`)。
NF=NFは$1=$1とかでもいいようだ(なお、$0=$0は動かないので注意)。