web-dev-qa-db-ja.com

sedが機能しないのはなぜですか?

リンクを抽出しようとしているHTMLがあります。現在、ファイルは次のようになっています。

website.com/path/to/file/234432517.gif" width="620">
website.com/path/to/file/143743e53.gif" width="620">
website.com/path/to/file/123473232.gif" width="620">
website.com/path/to/file/634132317.gif" width="620">
website.com/path/to/file/432432173.gif" width="620">

Sedを使用して、すべての行から" width="620">を削除しようとしています。これが私のsedコードです:

Sudo sed -i "s/\"\swidth\=\"\d+\"\>//g" output

なぜこれが機能しないのですか?私がグーグルで検索すると、このようなコードになりますが、何らかの理由で機能しません。

5
Andrew Pullins

これが私のsedソリューションです。

sed -E 's/(.*)" width="[0-9]+">/\1/' filename

sedの代替として、grepを使用してファイルからデータを抽出することをお勧めします。

これはあなたのために働くでしょう:

grep -o "website.*\.gif" filename

そして、terdonが示唆したように、grepを使用した先読みソリューションは次のとおりです。

grep -Po '.*(?="\swidth="\d*">)' filename

また、cutはあなたの状況に適したオプションです:

cut -f1 -d'"' filename
4
Ravexina

または、短い交換の場合は、gifの後のすべてを単に削除します

sed 's/gif.*/gif/' file

.*は任意の数の文字に一致します。失いたいものが常に、見つけることができる文字列の後ろにあり、その行に他のインスタンスがない場合に限ります。これは、以前のgifwebsite.com/path/to/gif/xyz.gif" width..."に一致するため、望ましくない結果をもたらします。

1
matt

Perl正規表現 を作成したので、 se Perl だけを実行できます。 Perl コマンドの代わりに、1行の sed コマンドを発行できます。そうすることで、正規表現を別の方言に翻訳する必要がなくなり、Perlの便利な機能を放棄する必要がなくなります。

  • sed -iの代わりに、Perl -pi -eを使用します。
  • sed -i.bakの代わりに、Perl -pi.bak -eを使用します。 (任意のサフィックスを使用できます。.bakである必要はありません。)

terdon says のように、-iでは、少なくとも-iなしで同じコマンドを試したことがない場合は、サフィックスを指定してバックアップファイルを作成するのが最善です。 (これはPerlの場合と同様にsedの場合も同様です。)

特定のコマンドでは次のようになります。

Perl -pi.bak -e "s/\"\swidth\=\"\d+\"\>//g" file

検索および置換パターンを 単一引用符を使用 する場合、その中に現れる"文字をエスケープしたり、二重引用符で囲まれたシェルの 興味深いルール を追跡したりする必要はありません。テキスト。これにより、読み書きが簡単になります。 (これはPerlに固有のものではありません。sedコマンドも同様に単純化できます。)このコマンドは同等です。

Perl -pi.bak -e 's/"\swidth\="\d+"\>//g' file

これらのコマンドのいずれかを使用すると、例の行は次のように変更されます。

website.com/path/to/file/234432517.gif
website.com/path/to/file/143743e53.gif
website.com/path/to/file/123473232.gif
website.com/path/to/file/634132317.gif
website.com/path/to/file/432432173.gif

さらに読む:

0
Eliah Kagan