如何用 python 表达式替换 sed/perl 表达式(仅更改和打印匹配的行)?

如何用 python 表达式替换 sed/perl 表达式(仅更改和打印匹配的行)?

我问过了这个问题了解如何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

正如您所看到的,在这种情况下,使用本机文本处理工具(sedawk)将是您的最佳选择。

相关内容