簡體   English   中英

我們如何在 python 中實現 Linux 命令 `sed`?

[英]How can we implement the Linux command `sed` in python?

sed是什么?

如果您已經知道sed是什么,您可以跳過閱讀本文的下一部分。

sed命令的示例是什么?

假設:

  • 我們想從名為input.txt的文件中讀取數據
  • input.txt包含大量英文文本(例如 Jane Austin 小說)
  • 我們想用字符串"dog"替換每次出現的字符串“ cat
  • 我們希望input.txt保持不變,並將 output 寫入當前工作目錄中名為output.txt的文件

執行上述操作的sed命令如下所示:

sed 's/cat/dog/g' input.txt | tee output.txt

sed命令的非常籠統的描述,沒有示例

更流行的 Linux 命令之一被命名為sed

sed ”代表“ stream 編輯器

sed具有以下屬性:

  1. 將字符的 stream 輸入sed機器(例如“hello world”)
  2. sed修改它收到的文本。
  3. sed將修改文本發送到 output 字符的 stream。

output stream 通常是 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進行更換,我會考慮使用 Windows Linux 子系統。 顯然,這需要用戶安裝 WLS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM