1つの[冗長]の代わりに2つ以上の行(この場合はすべての行)でsedが機能するようにします。

1つの[冗長]の代わりに2つ以上の行(この場合はすべての行)でsedが機能するようにします。

私はBashでUbuntu 16.04を使用しており、Nginx環境の特定のWebサイトに対してhttp2を有効にする必要があります。


デフォルトでは、ユーティリティはsed最初の関連行の最初のインスタンスでテキスト処理を実行します(パラメータをg使用すると、最初の関連行のすべてのインスタンスを処理します)2行以上(実際にはすべての行)

見て、使用する行数を指定できるパラメータをman sed見つけましたが-l(正しく理解している場合)、特定の行数に依存せずにすべての行で作業したいと思います。

sed私が経験している特別なケースは、これら2つの作業を1つに統合しようとしていることです。

s_a="/etc/nginx/sites-available/"
$domain="example.com"
sed -i "s/listen 443 ssl default_server;/listen 443 ssl http2 default_server;/" $s_a/$domain.conf
sed -i "s/listen [::]:443 ssl default_server;/listen [::]:443 ssl http2 default_server;/" $s_a/$domain.conf

sedこれら2つのタスクを次のように統合できます。

sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf

関連するすべての行がこの便利な1行操作で処理されるようにする最も安全な方法は、いくつかのパラメータを使用することです。ただし、パラメータを介してこれを行うことができるか(-l存在する場合)、またはパラメータを介して実行する必要があるかどうかはわかりません。正規表現を使用してください。

ベストアンサー1

次の理由でここにバグがあるようです。

sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf

正常に動作します。 「443 ssl http2 default_server」に置き換えられます$s_a/$domain.conf

-llコマンド専用です。

sed早く終了するなどしないように指示しない限り、すべての行を処理します。コマンドgのオプションは、s複数回表示されるクエリを処理する方法にのみ影響します。各ライン:そうでない場合は、g与えられた行の最初の項目のみが置き換えられますが、を使用するとgすべての項目が置き換えられます。どちらの場合も、置換はすべての行に適用されます。

おすすめ記事