web-dev-qa-db-ja.com

指定した単語が最初に現れる前にすべてを削除します

sedを使用して、指定されたWordが最初に出現する前にすべてを削除するにはどうすればよいですか?

私がこれまでに試したこと:

echo $(cat /etc/nginx/sites-enabled/default | sed 's/^*.server/server/') > /etc/nginx/sites-enabled/default

最初の「サーバー」Wordを見つける前に、すべてのゴミをクリーンアップする必要があります。

主にsed正規表現が必要です...

スクリプトがDockerコンテナにコピーしている間に先行スペースを取得しているプロキシ情報を含むNginxのデフォルトファイルがあります。何らかのコマンドで削除する必要があります。

ファイル:

       server
{
listen 80 default_server;
location / 
{
proxy_set_header X-Forwarded-Host $Host;
proxy_set_header X-Forwarded-Server $Host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:5000;
}
}

どのようなキャラクターがいるのかわからないので、「サーバー」の前にすべてを削除したいと思います。

3
ArkadyB

次の単純なコマンドを使用して、行の先頭とWordの「サーバー」の間の空白文字(タブ、スペースなど)をすべて削除します(空白以外に何もない場合のみ)。

sed -i 's/^\s*server/server/' FILENAME

-iオプションは、ファイルをインプレースで変更します。つまり、すべての変更がすぐに適用および保存され、出力は取得されません。ファイルを書き換えずに、変更された新しいバージョンを表示したくない場合は、-iオプションを省略すると、コマンドはそれをSTDOUT(標準出力ストリーム)に出力します。

正規表現^\s*serverを使用して、行の先頭とWordの "server"の間の任意の種類の空白と一致させ、それらの一致をWordの "server"自体に置き換えます。

2
Byte Commander

GNU sedには特別な形式の範囲アドレス0,/pattern/があり、ファイル内で最初に出現するpatternのみを照合できます。

sed '0,/server/ s/^.*server/server/' /etc/nginx/sites-enabled/default

または(マッチが行の先頭にも固定されるため、おそらくより良い)

sed '0,/^.*server/ s//server/' /etc/nginx/sites-enabled/default


最初に試してから-i(インプレース)フラグを追加するか、バックアップ-i.bakを使用してください

1
steeldriver