使用 sed 用一行替换多个连续行

And*_* L. 1 sed text-processing regular-expression replace

在我所有的 python 脚本中,我想替换连续的 2 行

import matplotlib as mpl
mpl.style.use(mpl_plt_default_template)
Run Code Online (Sandbox Code Playgroud)

只用那条线

plt.style.use(mpl_plt_default_template)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经找到了一种方法来用应用于这些行中的每一行的表达式替换 2 个连续的行,但没有找到如何用一行完全替换 2 行。关于我不成功的方法,它应用了以下 sed 字符串:

sed '/import matplotlib as mpl$/N;//s/mpl.style.use(mpl_plt_default_template)/plt.style.use(mpl_plt_default_template)/g'
Run Code Online (Sandbox Code Playgroud)

请注意,第一行 ( import matplotlib as mpl) 也可以出现在文件中的其他位置,并且应该在那里保持不变,因此目标是仅当发现两行都按照给定的顺序紧随其后时才执行替换。

编辑其他范围涉及find

最终目标是find使用类似于以下方式的管道替换通过- 命令找到的几个文本文件中的这两行:

find /path/to/dir/ -type f -exec sed 'old-lines/s/single-new-line' {} \;
Run Code Online (Sandbox Code Playgroud)

系统特性:

操作系统:Lubuntu 20.04 LTS

Qua*_*odo 5

要编辑文件,请使用可编写脚本的文本编辑器,例如EdEx(均为 POSIX 编辑器)。语法非常相似。

printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'w' 'q' | ed -s file
Run Code Online (Sandbox Code Playgroud)
printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'x' | ex file
Run Code Online (Sandbox Code Playgroud)
  • printf '%s\n' 向编辑器提供命令。

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

  • s/mpl/plt 在下一行执行替换。

  • wqx保存更改。

如果你真的想要 Sed,

sed '/^import matplotlib as mpl$/N; s/.*\nmpl/plt/' file
Run Code Online (Sandbox Code Playgroud)

解决您的扩展问题:

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 {} \;
Run Code Online (Sandbox Code Playgroud)

  • @AndreasL。如果您有其他问题,请考虑打开另一个问题。 (2认同)