我问过了这个问题了解如何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
//perl
awk
答案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
)将是您的最佳选择。