Используйте sed, grep или awk без perl, чтобы воспроизвести позитивный взгляд - PullRequest
5 голосов
/ 09 марта 2019

Мне нужно извлечь RJ3fadfiasdUYBxF6z из:

 {"user":{"id":1325135,"uuid":"134513451","email":"ansdfaha@aol.com","joined_at":"2012-01-01T013:511:124.000Z","username":"testicl","title":"testli","thumb":"https://plex.tv/user/avatar?c=","hasPassword":true,"authToken":"RJ3fadfiasdUYBxF6z","authentication_token":"RJ3fadfiasdUYBxF6z","subscription":{"active":false,"status":"Inactive","plan":null,"features":["adaptive_bitrate","collections","photos-metadata-edition","radio","photos-favorites","federated-auth","Android - PiP","publishing_platform","news","kevin-bacon","client-radio-stations","TREBLE-show-features","web_server_dashboard","conan_redirect_qa","conan_redirect_alpha","conan_redirect_beta","transcoder_cache"]},"roles":{"roles":[]},"entitlements":[],"confirmedAt":"2012-01-01T13:31:31.000Z","forumId":23573,"rememberMe":false}}

регулярное выражение с PCRP прекрасно работает

(?<=authToken\":\")(\w+)

Как мне извлечь RJ3fadfiasdUYBxF6z, используя либоawk, sed или grep без позитивного взгляда назад?У меня нет поддержки perl.
Я делаю это из скрипта bash на маршрутизаторе openwrt.

Ответы [ 6 ]

4 голосов
/ 09 марта 2019

Может быть, вы могли бы установить jq и использовать его?

jq .user.authToken < a.json
"RJ3fadfiasdUYBxF6z"
4 голосов
/ 09 марта 2019

Вы можете использовать следующую команду sed:

sed 's/.*"authToken":"\([^"]*\)".*/\1/' file
4 голосов
/ 09 марта 2019

Звучит так, как будто grep - это честная игра

grep -Po '(?<=authToken\":\")(\w+)' file

Примечание. Для этой поддержки libpcre необходима дополнительная библиотека grep.

2 голосов
/ 11 марта 2019

Некоторые версии Linux поставляются с pcregrep, где вы можете использовать обходные пути ..

Проверьте это

$ pcregrep -o '(?<=authToken\":\")(\w+)' json.test 
RJ3fadfiasdUYBxF6z
$ 

Вот версия в моем RHEL.

$ pcregrep --version
pcregrep version 7.8 2008-09-05
$ 
1 голос
/ 09 марта 2019

Решение awk (проверено при openwrt):

awk -F: -v RS=, '$1~/"authToken"/{gsub("\"","",$2);print $2}' file
RJ3fadfiasdUYBxF6z

Или для более точного соответствия используйте равное ==:

awk -F: -v RS=, '$1=="\"authToken\""{gsub("\"","",$2);print $2}' file
RJ3fadfiasdUYBxF6z

$1=="\"authToken\"" функциональноравно $1~/^"authToken"$/, но горит немного быстрее.

0 голосов
/ 31 мая 2019

Вложенные структуры данных должны работать с инструментами, которые осведомлены о модели данных (в данном случае JSON), иначе всегда будут присутствовать риски ложных срабатываний или непреднамеренных сбоев.Теперь, jq ответ уже дан, вот альтернатива, использующая Unix-инструмент Walk-Path для JSON: jtc:

bash $ jtc -w'<authToken>l' input.json
"RJ3fadfiasdUYBxF6z"
bash $ 

, если вы хотитеотбросьте кавычки, затем введите опцию -qq.

PS> Раскрытие информации: я являюсь создателем инструмента оболочки jtc - cli для операций JSON

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