ディレクトリ構造内に多くのファイルがあります。正規表現を使用して、それらのファイルから文字列 (つまり URL) を抽出したいと考えています。
私はこれを試しました:
find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt
... しかし、期待通りには動作しません。find
一部は正常に動作しますが、xargs
1sed
つは正常に動作しません。urls.txt で取得されるのは、すべてのファイルの連結だけです。
答え1
同じfind
コマンドを使用すると、正規表現に一致する URL が返されます。
find . -path "*alder/ * / * .html" -exec grep -oh "http://[^'\"]*" {} +
とは異なりfind...-print | xargs command...
、このアプローチは、名前に空白やその他の難しい文字が含まれるファイルでも機能します。
オプション-o
は、grep
一致した行ではなく、一致した部分のみを返すように指示します。 -h
一致が見つかったファイル名の出力を省略するように指示します。
OP のコマンドfind
は、パスにスペースが含まれる名前のファイルのみに一致します。これはおそらく必要なものではないと思うので、現在のディレクトリのサブディレクトリの任意の深さにある、名前が で終わるfind
すべてのファイルを検索するコマンドの代替形式を次に示します。.html
alder
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