如何使用 vim/sed/awk 添加复杂文本

如何使用 vim/sed/awk 添加复杂文本

以下较旧的帖子(如何在命令行上使用 vim 将文本添加到文件中间?&如何将一个文件的内容插入到另一个文件的模式(标记)之前?),我有一个更复杂的案例,需要您的建议。我有以下 Test.conf 文件:

server {
    listen       80;
    server_name  jenkins2;

    location /DE06/ {
        proxy_pass     http://jenkins2:18015/DE06/;
    }
}

我想运行一个命令,所以最后,文件内容将是:

server {
    listen       80;
    server_name  jenkins2;

    location /DE15/ {
        proxy_pass     http://jenkins2:18015/DE15/;
    }

    location /DE06/ {
        proxy_pass     http://jenkins2:52716/DE06/;
    }
}

意味着我需要找到单词 jenkins2 的第一次出现,然后添加以下内容:

location /DE15/ {
    proxy_pass     http://jenkins2:18015/DE15/;
}

知道什么是正确的命令吗?

答案1

vim +/jenkins2 +j +":r insert.txt" +gg=G +wq testfile.txt

其中 insert.txt 包含您要添加的代码段,testfile.txt 是您要编辑的文件。

不过,我不确定 vim 是最好的工具。

  • +/jenkins2搜索詹金斯2
  • +j向下移动一行
  • ":r insert.txt"读取要插入的文件。注意引号!
  • +gg=G自动缩进文件
  • +wq并写下来

答案2

我找到了一个有效的 sed 命令:

sed -i -e '/jenkins5/{ r example.txt' -e '; :L; n; bL;}' nginx_jenkins.conf

当需要 env 参数时,可以使用:

sed -i -e '/'${Alias}'/{ r example.txt' -e '; :L; n; bL;}' nginx_jenkins.conf

答案3

为了乐趣和学习,作为您示例中的 vimgolf,有这个

vim +"4t4|/D/,/}/t4|'[,s/06/15/|s/52716/18015/|x" file.conf

命令由 分隔|

  • 4t4将第 4 行复制到第 4 行
  • /D/,/}/t4从包含第一个的行D到包含下一个的行},复制到第 4 行
  • '[,s/06/15/从最后一次更改的第一行到当前行(最后一次更改的最后一行),替换0615
  • s/52716/18015/在当前行替换(06上次替换的位置)
  • x保存更改并退出

:h :copy, :h '[, :h :/

相关内容