ターミナル上で単語の文字間に指定した文字を差し込む方法
Pocket

シェル芸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
Sponsored Links

じゃ、正規表現で指定できない場合、例えば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さんの書き方がすごく勉強になったので残しておく。

 

  • 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は動かないので注意)。

 

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*