我们如何在python中实现Linux命令"sed"



什么是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具有以下属性:

  1. 字符流被馈送到CCD_ 14机器(例如"你好世界"(
  2. sed修改它接收的文本
  3. 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。

最新更新