如何使我的 sed 命令在 GNU 中工作在 BSD 中工作

如何使我的 sed 命令在 GNU 中工作在 BSD 中工作

我的 ~/.ssh/config 中有一个块内容。以“# BEGIN AUTO GENERATED CONTENT”行开始,以“# END AUTO GENERATED CONTENT”行结束

我有一个命令替换这两行之间的内容,内容是从名为“config”的文件中读取的

sed -i -ne '/# BEGIN AUTO GENERATED CONTENT/ {p; r config' -e ':a; n; /# END AUTO GENERATED CONTENT/ {p; b}; ba}; p' ~/.ssh/config

它在 ubuntu 中运行良好,但在我使用 bsd sed 的 mac 中无法运行。它给出了这个错误消息:

sed: 1: "/# BEGIN AUTO GENERATED ...": unexpected EOF (pending }'s)

我需要更正这个命令才能在 bsd 中工作。不在 mac 中使用 gsed

答案1

首先,由于您使用的是 Mac,因此单独的-i选项不起作用。您需要为其提供一个值,在您的情况下为空值。

其次,由于开关已生效,因此可以根据您的情况更改p;b该对。分支命令与旧版本中的右大括号不能很好地结合起来。p;d-nbseds

$ sed -i '' -ne '/# BEGIN AUTO GENERATED CONTENT/{' -e 'p;r config' -e ':a;n' -e '/# END AUTO GENERATED CONTENT/{' -e 'p;d' -e '}' -e 'ba' -e '}' -e 'p' ~/.ssh/config

除非这是一种使用并抛出的东西,否则最好将其重写在文件中,然后调用为:

$ sed -i '' -nf ./code ~/.ssh/config

$ cat ./code
   /# BEGIN AUTO GENERATED CONTENT/{
      p
      r config
      :loop
         n
         /# END AUTO GENERATED CONTENT/{
            p
            d
         }
      bloop
   }
   p

相关内容