sed -e 's'コマンドを終了しませんでした。

sed -e 's'コマンドを終了しませんでした。

Figletで生成されたいくつかのテキストからすべてのバックスラッシュをエスケープしようとしています。これが私が今まで持っているものです。

figlet -f $font -t "Foo Bar" | sed -e "s|\\|\\\\|g"

何らかの理由でこれはうまくいきませんが、うまくいきます。

figlet -f $font -t "Foo Bar" | sed -e "s| |X|g"

sedがここでどのように機能するか誤解していますか?これについても同様の投稿が見つかりません。

ベストアンサー1

sed -e "s|\\|\\\\|g"二重引用符は、解析を試みるシェルに含まれるバックスラッシュを保護しません。より簡単な例を使用すると、簡単に確認できます。

$ echo 'blah\blah'| sed -e "s|\\|blah|g"
sed: -e expression #1, char 10: unterminated `s' command

$ echo 'blah\blah'| sed -e 's|\\|blah|g'
blahblahblah

最初のフォームを使用するには、sed二重引用符ではなく一重引用符に切り替える必要があります。

$ figlet -t "Foo Bar" | sed -e 's|\\|\\\\|g'
 _____             ____
|  ___|__   ___   | __ )  __ _ _ __
| |_ / _ \\ / _ \\  |  _ \\ / _` | '__|
|  _| (_) | (_) | | |_) | (_| | |
|_|  \\___/ \\___/  |____/ \\__,_|_|

二重引用符を使用する必要がある場合は、シェルをエスケープするにはより多くのバックスラッシュが必要ですsed

$ figlet -t "Foo Bar" | sed -e "s|\\\|\\\\\\\|g"
 _____             ____
|  ___|__   ___   | __ )  __ _ _ __
| |_ / _ \\ / _ \\  |  _ \\ / _` | '__|
|  _| (_) | (_) | | |_) | (_| | |
|_|  \\___/ \\___/  |____/ \\__,_|_|

おすすめ記事