ログトラフィックを観察していますが、さまざまな画像検索エンジン(特にBing)が頻繁に乱用されていることを確認しました。
例URL:
http://www.bing.com/images/search?q=dagger+genesis+solo&view=detailv2&&&id=C65E811DFE01FB11258D2EB4F516F3DD8F09049C&selectedIndex=4&ccid=ffC0NVO8&simid=608046582336849763&thid=JN.XnLfF7qiZGwjJzTCR6f7ZQ&mode=overlay
「Dagger Origins Solo」という検索自体を取り出したいです。
私はできます。
grep -o '=*'
しかし、検索の後には=記号とすべての内容が残ります。
「search?q=」と最後の単語の最後の最初の「&」(前の「+」)の間のすべての内容を把握したいと思います。
awkまたはcutを使用してできるだけ多くの文字列を削除し、指定されたフィールド区切り文字を使用して各単語を独自の列に配置し、その列を印刷するために非常に長く複雑な方法で到達できます。しかし、この方法も一貫性がありません。これは、検索の長さに制限がなく、ほぼすべての文字を含めることができるためです。
もっと簡単な方法があると思います。アイデアはありますか?
私の究極の目標は、クエリを削除し、それを一意のアイテムとして整理することです。
答え1
システムがgrep
PCREモードをサポートしている場合は、次のものを使用できます。周りを見てください(長さ0のアサーション)文字選択〜サイ search?q=
そして&
grep -Po '(?<=search\?q=).+?(?=&)'
2つの間に貪欲でない修飾子を使用すると、?
最初の項目で一致が停止します&
。
答え2
あなたはできます
sed 's/^.*search?q=\([^&]*\)&.*/\1/' file
search?q=
それがすることは、theとtheの間で貪欲ではない一致を実行することです。&
どの出力
dagger+genesis+solo
+
記号を空白に変更したい場合は、
sed 's/^.*search?q=\([^&]*\)&.*/\1/;s/+/ /g' file
どの出力
dagger genesis solo
答え3
そしてsed
:
sed 's/\([^=&]*.\)\{2\}&.*/\1/' <<""
http://www.bing.com/images/search?q=dagger+genesis+solo&view=detailv2&&&id=C65E811DFE01FB11258D2EB4F516F3DD8F09049C&selectedIndex=4&ccid=ffC0NVO8&simid=
逆参照一致に発生回数を指定した場合は、指定した一致のみを引用するsed
必要があります。したがって、上記の例では、参照は単に返されます。
dagger+genesis+solo
答え4
Lookbehind と Lookahead アサーションには grep を使用します。
grep -oP "\=\K.*(?=\&view)"
ここでは、
\K ==> zero-width look-behind assertion
(?=\&view) ==> zero-width look-ahead assertion
だからprint\=
とie&view
の間の部分です。.*