53646


redis-cli を用いて、今現在の redis の config 情報を yaml で出力しようと思いました。

[code]

    redis-cli config get '*' | sed -e $'N;s/\\\n\\(.*\\)/: "\\1"/'
    
[/code]

redis-cli は「設定項目」「その値」が交互に続く形で出力を行うので、それを、上記のように sed で yaml 形式に整形しようと考えました。

これは、 linux サーバーで実行すると、問題なく実行されます。一方、手元の mac で実行すると、以下のエラーを出力します。

[code]

    $ redis-cli config get '*' | sed -e $'N;s/\\\n\\(.*\\)/: "\\1"/'
    sed: 1: "N;s/\
    \(.*\)/: "\1"/
    ": unterminated substitute pattern
    
[/code]

### 質問

  * Mac の sed で上記の sed script がエラーになるのはなぜですか？

### (追記) バージョン情報

  * linux 上: `sed (GNU sed) 4.2.2`
  * mac: 確認方法がわからないですが、 `man sed` によると以下が書いてあります。 
    * `The sed utility is expected to be a superset of the IEEE Std 1003.2 (``POSIX.2'') specification.`
    * man ページの末尾の日付: `May 10, 2005`


CC BY-SA 4.0
2019-03-21T11:24:03.783
53622
2019-03-22T05:30:01.810
2019-03-22T05:08:05.723
754
754
question
macos sh sed posix
posix compliant だと思っている sed コマンドが linux と mac で挙動が違う


問題が判明したので、自己回答します。

posix sed での s 式は、次の形式です。

> [2addr]s/BRE/replacement/flags

ここで、`\`の直後に改行文字を入力することが適切なのは、 replacement の中だけです。自分は、 BRE の中でそれをやろうとしていました。

なので、今回のスクリプトは、以下のようにすると posix compliant になります。

[code]

    redis-cli config get '*' | sed -e 'N;s/\n\(.*\)/: "\1"/'
    
[/code]

### 参考

<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html>


CC BY-SA 4.0
2019-03-22T05:30:01.810
53646
2019-03-22T05:30:01.810
754
53622
answer