繰り返しが外にあるワンライナー(Perl/Ruby/Python)

複数行の標準入力を受けて、フィルタ処理するワンライナーです。
PerlやRubyなら、-nオプションや-pオプションで、全行処理ができるので簡単です。ただし、改行は取り除いておく必要があります。

Perl

takk@deb9:~$ seq 10 | perl -ne 'chomp;print"[$_]\n"'
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
takk@deb9:~$

Ruby
驚くことにオプションがPerlと同じ、$_は暗黙のgetsで受けた文字列ですが、クォート中に書けないようですので、+で結合しています。

takk@deb9:~$ seq 10 | ruby -ne 'chomp;puts "["+$_+"]"'
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
takk@deb9:~$

Python
Pythonはなかなか辛いものがありますね。PerlやRubyのような-nオプションがないので、スクリプト中でforで回すしかないです。また標準入力読み込みのためsys.stdinを使うのでimportが必要になります。しかしimport sys;と書くとforに続かず。仕方なく改行しました。ワンライナーになりませんでした。

takk@deb9:~$ seq 10 | python3 -c 'import sys
for line in sys.stdin:print("["+line.strip()+"]")'
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
takk@deb9:~$

まあPythonの用途としてワンライナー書いてはいけないのかもしれません。コマンドの達人になりたい私としては、Pythonでもワンライナー書きたいのですが。

コメント

タイトルとURLをコピーしました