bash: извлечь конкретную строку из файла и удалить символы - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь извлечь конкретное строковое значение из текстового файла, а затем удалить из него обратную косую черту.имя значения "display_url"

Мой сценарий:

url=$(cat /var/scripts/string.txt | grep -oP '(?<=display_url":")[^"]+')

for link in $url; do
     echo 'https://'$link
done

вывод:

https://pastebin.com\/WRv5ir4Y
https://reddit.com\/r\/IBO\/comments\u2026

Требуемый вывод:

https://pastebin.com/WRv5ir4Y
https://reddit.com/r/IBO/comments/u2026

текстовый файл:

{"created_at":"Thu Dec 13 08:43:38 +0000 2018","id":1073136349845303297,"id_str":"1073136349845303297","text":"https:\/\/t.co\/aPu5ln7yjO\nhttps:\/\/t.co\/pBvevjSCc9\n\n#osectraining","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":961508561217052675,"id_str":"961508561217052675","name":"Online Security","screen_name":"osectraining","location":"Israel","url":"https:\/\/www.onlinesecurity.co.il","description":"OnlineSecurity provides online cyber-security training courses and certification, from beginner to advanced with the most advanced virtual labs in the field.","translator_type":"none","protected":false,"verified":false,"followers_count":2,"friends_count":51,"listed_count":0,"favourites_count":0,"statuses_count":1,"created_at":"Thu Feb 08 07:54:39 +0000 2018","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","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_link_color":"1B95E0","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/961510231346958336\/d_KhBeTD_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/961510231346958336\/d_KhBeTD_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/961508561217052675\/1518076913","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"quote_count":0,"reply_count":0,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"osectraining","indices":[49,62]}],"urls":[{"url":"https:\/\/t.co\/aPu5ln7yjO","expanded_url":"https:\/\/pastebin.com\/WRv5ir4Y","display_url":"pastebin.com\/WRv5ir4Y","indices":[0,23]},{"url":"https:\/\/t.co\/pBvevjSCc9","expanded_url":"https:\/\/www.reddit.com\/r\/IBO\/comments\/9ragj7\/ioc_in_10_hours\/","display_url":"reddit.com\/r\/IBO\/comments\u2026","indices":[24,47]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"low","lang":"und","timestamp_ms":"1544690618369"}

есть идеи?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Я бы использовал анализатор командной строки JSON jq:

jq -r '"https://" + .entities.urls[].display_url' /var/scripts/string.txt
  • -r означает «возврат необработанных входных данных» (строки без кавычек)
  • "https://" + concat ...
  • .entities.urls[] ... для каждого элемента массива .entities.urls ...
  • .display_url ... значениеdisplay_url member "

Результат:

https://pastebin.com/WRv5ir4Y
https://reddit.com/r/IBO/comments
0 голосов
/ 13 декабря 2018

Причина, по которой вам нужен и этот grep, и отдельный sed для его анализа, заключается в том, что grep может использовать регулярные выражения Perl (power ...) , но sedне может.Возможно, у вас есть Perl - используйте его, если вы это сделаете.

perl -pe '
   s/\\//g;
   s{.*?display_url":"}{https://};
   s{",".*display_url":"}{\nhttps://} while /display_url/;
   s/",".*/\n/;
 ' /var/scripts/string.txt
https://pastebin.com/WRv5ir4Y
https://reddit.com/r/IBO/commentsu2026

И практически всегда есть awk.

awk '{
   gsub("\\\\","",$0);
   split($0, chnk, "display_url.:.");
   for (x=2; x<=length(chnk); x++) {
      gsub("\".*","", chnk[x]);
      printf "https://%s\n", chnk[x];
   }
}' /var/scripts/string.txt
https://pastebin.com/WRv5ir4Y
https://reddit.com/r/IBO/commentsu2026

Но если вы не можете использовать ни один из них, тогдаодин sed для удаления обратной косой черты и некоторой базовой обработки строк оболочки в цикле, потому что это весело.: D

$: txt=$(sed 's/\\//g' i)
$: while [[ "$txt" =~ display_url ]]
   do txt=${txt#*display_url?:?}
      echo https://${txt%%?,*}
   done
https://pastebin.com/WRv5ir4Y
https://reddit.com/r/IBO/commentsu2026

Самое сложное - обойти двойные кавычки при разборе оболочки, но я уверен, что кто-то может предложить лучший способ.

0 голосов
/ 13 декабря 2018

Измените ваш сценарий на:

url=$(grep -oP '(?<=display_url":")[^"]+' /var/scripts/string.txt )
sed 's/\\//g;s@^@https://@' <<< "$url"

должно помочь.

  • удален бесполезный кот
  • используйте sed для подстановки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...