首頁>Linux>source

在我所有的python指令碼中,我想替換连續的2行

import matplotlib as mpl
mpl.style.use(mpl_plt_default_template)

仅一行

plt.style.use(mpl_plt_default_template)

到目前為止,我已经找到了一種方法,该方法可以將两个连續的行替換為應用於每行的表達式 ,但不是如何用單行完全替換這两行.對於我不成功的方法,它應用了以下sed-string:

sed '/import matplotlib as mpl$/N;//s/mpl.style.use(mpl_plt_default_template)/plt.style.use(mpl_plt_default_template)/g'

Note 第一行( import matplotlib as mpl )也可能出現在檔案 and should be left unchanged there中的其他位置 ,因此,目標是仅在找到两行時,按照给定的順序在另一行之後进行替換。

EDIT on additional scope involving find

最终目標是將這2行替換為通過 find找到的几个文字檔案 -使用類似這樣的管道命令:

find /path/to/dir/ -type f -exec sed 'old-lines/s/single-new-line' {} \;

System-specifics:

OS:Lubuntu 20.04 LTS

最新回復
  • 5月前
    1 #

    要編輯檔案,請使用可編寫指令碼的文字編輯器,例如Ed或Ex(两个POSIX編輯器)。 語法非常相似。

    printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'w' 'q' | ed -s file
    
    printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'x' | ex file
    

      printf '%s\n' 向編輯器提供命令。

      /^import matplotlib as mpl$/d 删除与模式匹配的第一行。

      s/mpl/plt 在下一行執行替換。

      wqx 儲存更改。

      如果您真的想要Sed,

      sed '/^import matplotlib as mpl$/N; s/.*\nmpl/plt/' file
      

      解決您的擴充套件問题:

      find /path/to/dir/ -type f -exec sh -c '
          printf "%s\n" "/^import matplotlib as mpl\$/d" "s/mpl/plt" "w" "q" |
          ed -s "$1"' sh {} \;
      

  • 5月前
    2 #

    如果不必是 sed ,您可以使用 awk 完成任務:

    awk '$0=="import matplotlib as mpl" {buf=$0; next}
         buf {if (/^mpl\.style\.use/) {sub(/^mpl/,"plt")} else {print buf}; buf=""} 1' inputfile
    

      When a line exactly reading import matplotlib as mpl 遇到,它將儲存在一个緩衝區 buf 並跳到下一行。

      如果設置了緩衝區變數,並且当前行以 mpl.style.use開頭 ,它將用 plt.style.use替換当前行的该部分 並丢棄緩衝區內容。

      如果設置了緩衝區變數,但是当前行与"第二行"模式不匹配,它將在print当前行之前print緩衝區內容.然後將緩衝區清除。

      對於緩衝區為空時遇到的所有行,我们只需按原樣print行。

      如果您需要更精確地匹配第二行,請將第二條規則更改為

      buf {if ($0=="mpl.style.use(mpl_plt_default_template)" {sub(/^mpl/,"plt")} else {print buf}; buf=""}
      

  • fedora:使用GStreamer的Clementine無法播放OGG檔案
  • ubuntu:尽管安裝了wine-gecko 2471,wine仍找不到wine Gecko