Text-Processing
使用 sed 將多個連續的行替換為單行
在我所有的 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
要編輯文件,請使用可編寫腳本的文本編輯器,例如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
在下一行執行替換。w
和q
或x
保存更改。如果你真的想要 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 {} \;