各行で特定の単語を検索し、残りの行を印刷します。

各行で特定の単語を検索し、残りの行を印刷します。

サーバーのURLを含むテキストファイルがあります。たとえば、次のようになります。

request get https://abc.net/search?q=hello/world/hello/word/search=5&size=10
request get https://abc.net/search?q=hello/world/hello/world/hello/word=5

このテキストファイルでは、文字列 "search?q="の後のテキストを別のファイルである出力ファイルに保存したいと思います。

hello/world/hello/word/search=5&size=10
hello/world/hello/word/hello/world=5
hello1world1/hello/world/hello/word

答え1

sed -n '/search?q=/{s/.*search?q=//;p;}' infile > outfile

説明する:

/search?q=/この正規表現を含む行にのみ適用できる次のコマンドセット(中括弧)を作成します。

s/.*search?q=//最初の部分を2番目の部分(空)に置き換えます。

その後、pラインを印刷します。

この-nフラグはデフォルトでこの行の印刷を無効にします。

実際、次のように単純化できます。

sed -n '/.*search?q=/{s///;p;}' infile > outfile

コマンドに入力したパターンをs/空白のままにすると、最後に使用したパターンが再利用されるためです。


編集:コメントの簡略化を指摘したRobertLに感謝します。

sed -n 's/.*search?q=//p' infile > outfile

これは、置換が行われたときにのみその行を印刷するためにコマンドpのフラグを使用します。s

答え2

grepバージョンがPCREをサポートしている場合は、次のものを使用できます。

grep -oP 'search\?q=\K.*' infile > outfile

答え3

LookbehindのPerlベースの正規表現検索を使用すると、必要な結果が得られます。

grep -oP '(?<=search\?q\=)[^ ]*' *filename*

LookBehindは正規表現の一部なので、以前と\アイテム?を追加することを忘れないでください。=

関連情報