Text-Processing

使用 sed 將多個連續的行替換為單行

  • January 5, 2021

在我所有的 python 腳本中,我想替換連續的 2 行

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

只有這條線

plt.style.use(mpl_plt_default_template)

到目前為止,我已經找到了一種方法來用應用於每行的表達式替換 2 行連續的行,但不是如何用單行完全替換 2 行。關於我不成功的方法,它應用了以下 sed-string:

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

請注意,第一行 ( import matplotlib as mpl) 也可以出現在文件的其他位置,並且應該在那裡保持不變,因此目標是僅當發現兩行按給定順序依次出現時才執行替換。

編輯涉及的附加範圍find

find最終目標是使用類似於以下方式的管道替換通過 - 命令找到的幾個文本文件中的這兩行:

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

系統細節:

作業系統:Lubuntu 20.04 LTS

要編輯文件,請使用可編寫腳本的文本編輯器,例如EdEx(都是 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 {} \;

引用自:https://unix.stackexchange.com/questions/627460