sedに変数を渡すのに問題があります。

sedに変数を渡すのに問題があります。

sedに変数を渡すときに二重引用符を使用する必要があることを知っています。したがって、sedを使用して行番号付きファイルの行を表示するとき:

sed '894!d' cloud.cpp

私はうまくいきましたが、行番号894をsedに変数として渡したいので、次のことを試しました。

lnum=894
sed "$lnum!d" cloud.cpp

ただし、同じ構文を使用する単一引用符も機能しません。

sed "894!d" cloud.cpp

それでは、この場合、どのように変数をsedに渡すことができますか?

ベストアンサー1

変数に数字のみが含まれている場合、実行している操作は正しいものです。

sed "$lnum!d" cloud.cpp

sed通常、シェル変数を渡すには、次をお読みください。この回答


今、この場合は正しく行いましたが、まだ機能しません。これはシェルによるものbashです。これらのシェルは、(この機能は元々提供されており、後でコピーされる)とマークされている歴史的な拡張をサポートしています。zshcsh!cshbashzsh

では、対話型セッションで履歴拡張がデフォルトbashzsh有効になっており、二重引用符で囲まれています。

存在するzsh

$ seq 10 | sed "10!d" # <-- press enter
$ seq 10 | sed "10dash"

これはdash私の歴史上で始まる最も最近の命令ですd

存在するbash

$ seq 10 | sed "10!d"
bash: !d": event not found

.bashで始まるbashレコードには何もないからですd

履歴拡張をオフにできます。

set +H

または:

set +o histexpand

一緒にするbash

set -K

または:

setopt nohistexpand

存在するzsh


より移植可能な方法のために、シェルオプションに頼らずにいつでも次のことができます。

sed "$lnum"\!d cloud.cpp

これにより、シェルは文字通り!処理されます。

おすすめ記事