Sed

如何用 python 表達式替換 sed/perl 表達式(更改和列印僅匹配的行)?

  • July 16, 2015

我問過這個問題是為了了解如何perl替換sed.

現在我想知道以下命令(執行相同操作)的樣子python

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

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

可以寫成單行嗎?選擇?

只是為了好玩:

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//perl``awk

讓我們用一個簡單的例子來做這件事,考慮一個文件,我們將用字元串替換一行的每個數字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

如您所見,在這種情況下,使用本機文本處理工具(sedawk)將是您的最佳選擇。

引用自:https://unix.stackexchange.com/questions/216319