リンクを抽出しようとしている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
なぜこれが機能しないのですか?私がグーグルで検索すると、このようなコードになりますが、何らかの理由で機能しません。
これが私の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
または、短い交換の場合は、gif
の後のすべてを単に削除します
sed 's/gif.*/gif/' file
.*
は任意の数の文字に一致します。失いたいものが常に、見つけることができる文字列の後ろにあり、その行に他のインスタンスがない場合に限ります。これは、以前のgif
のwebsite.com/path/to/gif/xyz.gif" width..."
に一致するため、望ましくない結果をもたらします。
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
さらに読む: