
サーバーの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は正規表現の一部なので、以前と\
アイテム?
を追加することを忘れないでください。=