什么是sed
如果你已经知道sed
是什么,你可以跳过阅读这篇文章的下一部分。
什么是sed
命令的示例
假设:
- 我们想要从名为
input.txt
的文件中读取数据 input.txt
包含大量英文文本(如简·奥斯汀的小说(- 我们想要替换字符串"的每次出现;CCD_ 6";带有字符串
"dog"
- 我们希望不修改
input.txt
,并将输出写入当前工作目录中名为output.txt
的文件
执行上述操作的sed
命令如下所示:
sed 's/cat/dog/g' input.txt | tee output.txt
sed
命令的非常一般的描述,没有示例
一个比较流行的Linux命令名为sed
">sed";代表">流编辑器";
sed
具有以下属性:
- 字符流被馈送到CCD_ 14机器(例如"你好世界"(
sed
修改它接收的文本- CCD_ 16将修改后的文本发送到输出字符流
输出流通常是ASCII编码的文本文件(
sed
主要使用正则表达式来识别文本模式,并将其替换为其他文本。
独立于平台的要求
我们希望在python中实现sed
。
但是,我们的sed
实现应该在运行不同于Linux的操作系统的计算机上运行。
以下是不可接受的:
import subprocess
cmd = "sed 's/cat/dog/g' input.txt | tee output.txt".split(" ")
subprocess.call(cmd)
我自己实施sed
的可悲尝试
尝试的解决方案如下所示。
import subprocess
import os
import sys
def sed(stryng, istream=None, ostream=None):
if sys.platform == "linux":
subprocess.run(["sed", stryng])
subprocess.call(['sed', 's/"//g', inp], stdout=out_file)
elif os.name == 'nt':
# if running Windows
lead_up = "@ powershell - Command get-content somefile.txt | %{{$_ -replace "
expression = ""
replacement = ""
subprocess.run(lead_up + f"""{expression}","{replacement}"}}")
else:
raise NotImplementedError()
用法:
in_file = open("report_new.txt", "r")
out_file = open("report_new.txt", "w")
sed("'s/Nick/John/g'", in_file, out_file)
out_file.close()
in_file.close()
如果您仍在使用Python,您还可以直接操作该文件。(另请参阅https://askubuntu.com/a/747455)伪码:
subject, replacement = split pattern at /
s = read in_file
in s replace each subject with replacement
write s to out_file
我不熟悉sed
如何解释模式的细节;由于从sed的Regex方言切换到Python方言,可能会出现一些意想不到的行为。然而,基本功能应该大致相同。然而,我认为您已经放弃了完全一致的行为,因为您认为Powershell的等价物将与sed
执行相同的操作。
如果您想要实际的sed
来进行替换,我会考虑使用WindowsLinux子系统。显然,这需要用户安装WLS。