【问题标题】:Use sed, grep, or awk without perl to replicate positive lookbehind在没有 perl 的情况下使用 sed、grep 或 awk 来复制正向回溯
【发布时间】:2019-07-31 02:46:00
【问题描述】:

我需要从以下位置提取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}}

regex with PCRP works great

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

如何使用awksedgrep 提取RJ3fadfiasdUYBxF6z 而无需积极的后视?我没有 perl 支持。
我正在使用 openwrt 路由器上的 bash 脚本执行此操作。

【问题讨论】:

  • 这是 JSON 文件格式。有没有可以解析 JSON 的工具?
  • 我在 openwrt 路由器上使用 bash 脚本执行此操作,所以我不这么认为?试图让它尽可能轻。我是个超级新手。

标签: json regex bash awk sed


【解决方案1】:

听起来grep 是公平的游戏

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

注意:这需要一个额外的库 libpcre,以支持 grep 的原生 PCRE。

【讨论】:

  • 那不需要Perl? grep 支持 PCRE ...(或者它使用 Perl?)
  • 嗯,我以为 PCRE 是 perl 支持?我有 BusyBox v1.28.4 并且 grep 没有让我选择放置 -P 标志。
  • 我明白了。那么也许它确实需要 Perl —— 我认为 grep 本身就有这种支持,没有 Perl,但我想不是。
  • 它没有。它需要一个特殊的包来支持原生 PCRE,libpcre-ash: pcregrep: not found
  • 我的 RHEL 中有 pcregrep
【解决方案2】:

您可以使用以下sed 命令:

sed 's/.*"authToken":"\([^"]*\)".*/\1/' file

【讨论】:

    【解决方案3】:

    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"$/,但稍快一点。

    【讨论】:

      【解决方案4】:

      您可以安装jq 并使用它吗?

      jq .user.authToken < a.json
      "RJ3fadfiasdUYBxF6z"
      

      【讨论】:

      • 去掉引号添加选项-r&lt; 不是必需的。
      【解决方案5】:

      一些 linux 版本附带 pcregrep,您可以在其中使用外观。

      检查一下

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

      这是我的 RHEL 中的版本。

      $ pcregrep --version
      pcregrep version 7.8 2008-09-05
      $ 
      

      【讨论】:

      • 实际上我们在 cmets 中谈到了pcregrep,结果发现openwrt 并没有附带它,但是pcregrep 在支持时是一个不错的选择:)
      猜你喜欢
      • 2021-02-16
      • 2014-02-26
      • 2016-11-30
      • 2011-12-05
      • 2016-08-12
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多