ばぐばぐわーるど

Pythonなどなど

Pythonでワンライナー

シェルスクリプトは、Unix 系 OS のユーザにとって最も身近なプログラミング言語でもあり、その習得は必須の技能であると言えます。ほとんど改変を加えずに、様々なシステムでそのまま利用できるという汎用性の高さは非常に優れたものです。

ShellScript - シェルスクリプトを書くときに気をつける9箇条 - Qiita [キータ]

そうは言ってもシェルスクリプトとか覚えられません。というか末端ユーザーの僕にはシェルスクリプトが必要になる状況ってあんまり無いという・・・。使ってるのWindowsだし。万が一必要なときはググってコピペなのでまったく身につきません。


というわけで、何かあったときのためのPythonワンライナーの練習です。
Pythonなら辛うじてググらずにできるはず・・・たぶん・・・

Pythonは -cオプションをつけると後ろに書いた文字列をPythonのプログラムとして実行できます。文字を囲むのはダブルクォーテーションじゃなきゃ駄目みたいです。


とりあえず思いつくままに。

1 Hello World

python -c "print 'Hello World'"

2 0から99まで出力

 python -c "print '\n'.join([str(i) for i in range(100)])"

3 dir0からdir99までのディレクトリを作成

python -c "import os; [os.mkdir('dir'+str(i)) for i in range(100)]"

4 数値が1行ずつ書き込まれているファイルを読み、num+数値としたファイルを作る

printでリダイレクトとか使うとunicodeで出力されてしまいます。どうしたらいいんだろ。

python -c "print ''.join(['num'+i for i in open('num.txt')])" > newnum.txt

5 ファイルの文字をすべて大文字にして出力

python -c "print open('hoge.txt').read().upper()"


思いつかなくなったのでPerl one liner 集 perl 1行野郎を参考に書いていきます。

6 最初の50行を表示

python -c "print ''.join([line for line,i in zip(open('hoge.txt'),range(50))])"

7 任意の行を表示(2~5行まで)

python -c "print ''.join([line for i,line in enumerate(open('hoge.txt')) if 2<=i<=5 ])

8 commentという文字列が含まれている行を表示

python -c "print ''.join([i for i in open('comment.txt') if i.find('comment') != -1])"

9 commentまたはappleが含まれている行を表示

python -c "print ''.join([i for i in open('comment.txt') if i.find('comment') != -1 or i.find('apple') != -1])"

10 ファイル中にある行単位でのfooをbarに置き換える

1単語ずつ改行されているような場合を想定しています。
3項演算子を使います。だんだん雲行きが怪しくなってまいりました。

python -c "print ''.join(['bar' if i[:-1]=='foo' else i for i in open('okikae.txt') ])"

11 ファイル中のfooをbarに置き換える

11と違い普通の文章の場合を想定しています。
リスト内包で作ったリストをさらにリスト内包で・・・

python -c "print ''.join([i if i[-1]=='\n' else i+' ' for i in ['bar' if j[:-1]=='foo' else j for i in open('okikae.txt') for j in i.split(' ') ]])"

うわああああああ難しいいいいいできないいいいい
これだと改行直前か文字列中かのどちらかがうまく置き換わりません・・・

どうしたらいいの・・・あっ
replaceメソッド忘れてました///

python -c "print open('okikae.txt').read().replace('foo','bar')"

悩むくらいなら改行しろって話ですよね。
ダブルクォーテーションで閉める前に改行すると普通に入力を待ってもらえます。