マッチ後にsed echo文字列を実行する

マッチ後にsed echo文字列を実行する

直後の文字列をエコーアウトする必要があります/pbs.twimg.com\/profile_images\/。これは私が少し助けを借りて作成した検索ツール用で、誰もが推奨していますsed、でも私はあまり使わないsedよく分かりません。でも、スクリプトはこうです:

read -r Username ;\
wget -q -O - https://twitter.com/"${Username}" | \
 sed -n '/data-screen-name=.'"${Username}"'".*data-user-id=/I \
    {s/^.*data-screen-name=.'"${Username}"'".*data-user-id="\([0-9]*\)".*$/\1/Ip;q}'

このスクリプトはほとんどのアカウントで問題なく動作しますが、アカウントが非公開の場合は失敗します。代わりに検索するとIDのみが表示され、元のスクリプトのようにさまざまな変数が表示されません/pbs.twimg.com\/profile_images\/(そのため、行が選択され、data-screem-name=ツイッターAPI です。これは、API の取得方法すら知らない人向けにエクスポートしているため、ユーザーにとってできるだけ簡単にしようとしているからです。

私はいくつかの SO/SE の投稿を確認しましたが、これは重複ではないと思います。重複していたら申し訳ありません。

編集---- これは、HTML 内に行がないため、プライベート プロファイルでは機能しません。さらに調べたところ、/pbs.twimg.com\/profile_images\/ユーザーの ID が提供され、プライベート アカウントとオープン アカウントの両方に存在することがわかりました。

サンプルデータ:
現時点では、これを自分のアカウントで実行すると機能し、私の ID が表示されます。

Username="thematrix1o1"
717835108540030976

しかし、プライベートアカウントで実行すると、IDは取得されません(行がないため)

Username="touchmytweets"
.

(レポートにはドットはなく、空白です)

ここに私が見つけるべきものの画像がありますhttps://i.stack.imgur.com/WSACJ.jpg ご覧のとおり、彼女の ID は次のとおりです。726618076633030656
小規模サンプルレポート
ile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/726618076633030656\/wwYbLwbs_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/726618076633030656\/wwYbLwbs_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/418265825\/1463628965","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":n

答え1

出力には、任意の量のランダムなゴミと、興味のある 1 行が含まれます。その行を選択し、ID 以外のすべてを破棄して、結果を出力します。

 sed -n '/profile_images/s/.*profile_images\\\/\([0-9]\+\).*/\1/p'

その行が処理された直後に終了することで、少し効率化できます。

実際、これは元のコードとほぼ同じです。変更されたのは、使用される正規表現だけです。

答え2

このような、針を探すような作業に直面したとき、私は、可能であれば、それを行指向の問題に変換します。次のような方法でそれができるかもしれません。

$ sed -E 's:[0-9]+:\n&\n:g' filename \
| grep -F -A1 '/pbs.twimg.com\/profile_images\' | tail -1 

これにより、任意の数字文字列が単独で 1 行に配置され、文字列が grep され、その後の文字列が出力されます。

これはかなりのハックです。HTML を解析する正しい方法は、HTML パーサーを使用することです。ただし、1 つの文字列だけが必要な制御された入力の場合は、これで十分かもしれません。

もう少しすっきりしたアプローチとしては awk を使うことです。そのようなことを頻繁に扱うのであれば、間違いなく学ぶ価値があります。

関連情報