sed / perl式をPython式に置き換えるにはどうすればよいですか(一致する行のみを変更して印刷しますか?)

sed / perl式をPython式に置き換えるにはどうすればよいですか(一致する行のみを変更して印刷しますか?)

私は尋ねたこの問題perl交換方法を学びますsed

今、同じことをする次のコマンドがどのように見えるかを知りたいですpython

sed -n '/patternmatch/s%stuff%changed%p' file

perl -ne 'if ( /patternmatch/ ) { s%stuff%changed%; print }' file

一行で書けますか?選ぶ?

答え1

楽しみとして:

python -c 'import sys,fileinput,re;sys.stdout.writelines(re.sub("stuff", "changed", l, 1) for l in fileinput.input() if re.search("patternmatch", l))' file

これをしないでください:) sed//を使用してくださいperlawk

答え2

簡単な例を見てみましょう。ファイルを考慮すると、行のすべての番号を文字列に置き換えますHELLO。行に数字がない場合は、そのままにしてください。

#!/usr/bin/env python2
import re
with open('file.txt') as f:
    for line in f:
        if re.search(r'\d', line):
            print re.sub(r'\d', 'HELLO', line).rstrip('\n')
        else:
            print line.rstrip('\n')

テスト:

$ cat file.txt 
foo bar test
spam 1 egg 5

$ python script.py 
foo bar test
spam HELLO egg HELLO

また、以下を使用してくださいsed

$ sed '/[[:digit:]]/s/[[:digit:]]/HELLO/g' file.txt 
foo bar test
spam HELLO egg HELLO

time統計を確認してみましょう。

$ time sed '/[[:digit:]]/s/[[:digit:]]/HELLO/g' file.txt 
foo bar test
spam HELLO egg HELLO

real    0m0.001s
user    0m0.000s
sys 0m0.001s

$ time python script.py 
foo bar test
spam HELLO egg HELLO

real    0m0.017s
user    0m0.007s
sys 0m0.010s

ご覧のとおり、この場合は基本的なテキスト処理ツール(sedなどawk)を使用するのが最善の選択です。

関連情報