awkまたはsedを使用してhttp://example.com以降のすべてのアイテムを削除する方法

awkまたはsedを使用してhttp://example.com以降のすべてのアイテムを削除する方法

多数のURLを含む出力ファイルがあるとします。 awkまたはsedを使用してURLの一部を削除して最終結果をhttp://example.com取得http://example.com/folder/file.html

答え1

最初のシングル(ダブルではない)以降のすべてのアイテムを削除するには、次の手順を実行します/

sed -r 's#([^/])/[^/].*#\1#'

この式はs#([^/])/[^/].*#\1#正規表現を使用して置換を実行します([^/])/[^/].*。これは/、単一文字/(および入力行の末尾にある他の文字)が後に来ないすべての文字と一致します。

置換は、一致する項目を単一文字の前の文字/(それ以外の場合は置換)に置き換えます。

ファイルでテストしてみてください

http://example.com/folder/file.html
http://example.bar.com/folder/file.html
http://example.com:8080/folder/file.html
$ sed -r 's#([^/])/[^/].*#\1#' file
http://example.com
http://example.bar.com
http://example.com:8080

使用awk:

$ awk -F'/' '{ print $1 "//" $3 }' file
http://example.com
http://example.bar.com
http://example.com:8080

ここでは、フィールド区切り文字として使用/し、最初と3番目のフィールドを選択し、//それらの間の文字列を使用して出力します。

答え2

あなたが使用できるsed

 sed 's#^\(https\?://\)\?\([^/]*\)/.*#\1\2#' filename

このコマンドと次のファイルを使用します。

http://example.com/foo/bar.html
https://example.com/foo/bar.html
example.com/foo/bar.html

出力は次のとおりです

http://example.com
https://example.com
example.com

仕組みは次のとおりです。

  • \(https\?://\)\?http://またはの最大1つの発生と一致しますhttps://。角かっこは一致をキャプチャします。\1

  • \([^/]*\)この後から次まで一致し、一致/は次からキャプチャされます。\2

  • /.*残りの行と一致します。

答え3

sedURLが1行に1つずつあるか、スペースで区切られていると想定してURLの末尾の部分を削除するために使用されます。

sed 's!\(http://[^/]*\)[^ ]*!\1!g' < input > output

これはsedの検索と置換機能を使用します。パターン、置換、およびフラグ間の区切り記号はここで設定されます!

一致させるパターンは次のとおりです。

  • http://スラッシュを除くすべての項目 - パターンのこの部分は括弧内に「グループ1」として表示されます。
  • (スペースを除くすべての項目)、0回以上 - これは特にURLの末尾の部分です。いいえかっこ内にキャプチャ

代替案は次のとおりです。

  • 以前にキャプチャした「グループ1」

フラグは次のとおりです

  • グローバルに行いますg。つまり、1行にできるだけ何度も実行します。

答え4

大容量ファイルの場合、ジョブはgrepすばやく完了する可能性があります。構文も覚えやすいです。

grep -Eo '^https?://[^/]+' fname

使用sedには異常は必要ありません。

sed -r 's|(https?://[^/]*).*|\1|' fname

またはcut難しい正規表現を使用しないでください

cut -d'/' -f1,2,3 fname

関連情報