Ssh

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

  • May 7, 2019

我的 ~/.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

首先,由於您使用的是 Mac,因此單獨的-i選項將不起作用。您需要為其提供一個值,在您的情況下是一個空值。

其次,由於開關已生效,因此可以根據您的情況將該p;b對更改為。從那以後,分支命令不能很好地與舊的右大括號結合起來。p;d``-n``b``seds

$ 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

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