Python中相当于"sed -f"的命令

1 投票
3 回答
1310 浏览
提问于 2025-04-18 01:08

我有一组用于替换的正则表达式,保存在一个文件里(叫做sed.clean),内容如下:

#!/bin/sed -f
s/https\?:\/\/[^ ]*//g
s/\.//g
s/\"//g
s/\,//g
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

还有一些类似的行。 我想用这个文件来“清理”一组文本文件。 在bash中,我会这样做:

for file in $(ls rootDirectory)
do
    sed -f sed.clean $file > OUTPUT_FILE
done

我怎么能在Python中做类似的事情呢?

我的意思是,是否可以利用我在sed.clean文件中的正则表达式(或者把它们改写成Python能用的格式),这样就不用建立一个嵌套循环来逐个比较每个文件和每个正则表达式,而是像在bash中那样,只比较每个文件和sed.clean这个Python文件。 像这样:

files = [ f for f in listdir(dirPath) if isfile(join(dirPath,f)) ]
for file in files:
    newTextFile = re.sub(sed.clean, file)
    saveTextFile(newTextFile, outputPath)

而不是这样:

REs = ['s/https\?:\/\/[^ ]*//g', 's/\.//g',...,'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/']
files = [ f for f in listdir(dirPath) if isfile(join(dirPath,f)) ]
for file in files:
    for re in REs:
        newTextFile = re.sub(re, '', file)
        saveTextFile(newTextFile, outputPath)

谢谢!

3 个回答

0

你需要把你的 sed 脚本里的替换操作转换成 Python 里的对应写法。


s/<pattern>/<replacement>/<flags>
# is equivialent to
re.sub("<pattern>", "<replacement>", <input>, flags=<python-flags>)

注意,这种方式是贪婪的,所以在模式的结尾不需要加 /g。另外,模式里也不应该包含延迟参数,因为它们是作为 单独的参数传入的。比如:

re.sub("\.", "", "a.b.c.d", flags=re.MULTILINE)

y/<pattern>/<replacement>
# is equivivalent to
trans = str.maketrans("<pattern>", "<replacement>")
<input>.translate(trans)

不过对于 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ 这种情况,直接用 <input>.lower() 就可以了,非常简单。


for file in $(ls rootDirectory) 大致相当于(取自 这里

files = [f for f in os.listdir('<rootDirectory>') if os.path.isfile(f)]
for f in files:
    # do something

把这些放在一起:

import os # don't forget to import required modules
import re

output_file = open('C:\\temp\\output.txt', 'w')

def process(line):
    result = line
    result = re.sub("\"","", result)
    result = re.sub("\.","", result)
    # do all the stuff your sed script does and than
    return result

files = [f for f in os.listdir('.') if os.path.isfile(f)]
for file in files:
    file_handle = open(file_name, 'r')
    lines = file_handle.readlines()
    processed = map(process, lines)
    for line in processed:
        output_file.write(line)

想了解更多细节,可以参考 Python 的文档,里面有关于 正则表达式文件操作 的内容。

你可以尝试自动把你的 sed 脚本转换成 Python,但如果只是一次性的需求,手动转换会更简单。

0

试试这样使用 re.sub:

import re
>>> re.compile(r'\.')
<_sre.SRE_Pattern object at 0x9d48c80>
>>> MY_RE = re.compile(r'\.')
>>> MY_RE.sub('','www.google.com')
'wwwgooglecom'

你可以在 re.compile() 中编译任何正则表达式。

0

这些sed模式的作用是把文件中符合特定模式的行清空。在Python中,readlines()filter()re.sub()是你最好的选择。

撰写回答