複数のファイルで find と sed を使用して行を印刷するにはどうすればよいですか?

複数のファイルで find と sed を使用して行を印刷するにはどうすればよいですか?

ディレクトリ構造内に多くのファイルがあります。正規表現を使用して、それらのファイルから文字列 (つまり URL) を抽出したいと考えています。

私はこれを試しました:

find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt

... しかし、期待通りには動作しません。find一部は正常に動作しますが、xargs1sedつは正常に動作しません。urls.txt で取得されるのは、すべてのファイルの連結だけです。

答え1

同じfindコマンドを使用すると、正規表現に一致する URL が返されます。

find . -path "*alder/ * / * .html"  -exec grep -oh "http://[^'\"]*" {} +

とは異なりfind...-print | xargs command...、このアプローチは、名前に空白やその他の難しい文字が含まれるファイルでも機能します。

オプション-oは、grep一致した行ではなく、一致した部分のみを返すように指示します。 -h一致が見つかったファイル名の出力を省略するように指示します。

OP のコマンドfindは、パスにスペースが含まれる名前のファイルのみに一致します。これはおそらく必要なものではないと思うので、現在のディレクトリのサブディレクトリの任意の深さにある、名前が で終わるfindすべてのファイルを検索するコマンドの代替形式を次に示します。.htmlalder

find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +

より堅牢なアプローチ

他の種類の不正なhtmlファイルから保護するために、cas では、空白文字または>URL の終了を示す文字を許可し、以下も受け入れることをhttps推奨していますhttp

find . -path "*alder/ * / * .html"  -exec grep -oEh "https?://[^'\"[:space:]>]*" {} +

答え2

素早い回答をありがとうございます。パスに余分なスペースが入っていて申し訳ありませんが、スペースを削除すると、ここに投稿しようとするとパスがおかしくなります。

grep に sed を使用したいのですが、1.2 GB、25,000 ファイルを超えると非常に遅くなります。

答えを見つけました。最初の sed コマンドは "'= 文字でファイルを切り取り、2 番目の sed コマンドは行を印刷します。これが答えです。

find . -path "*alder.com/ * / * .html" -print| xargs sed -r "s/[\"'=]/\n/g"| sed -n "/^http\s?:/p" > urls.txt

関連情報