AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 696541
Accepted
Sergio Jimenez
Sergio Jimenez
Asked: 2022-03-24 07:34:37 +0800 CST2022-03-24 07:34:37 +0800 CST 2022-03-24 07:34:37 +0800 CST

替换unix文件中的base64值

  • 772

我有一个问题,我有一个文件 test.txt,其内容如下:

objectClass: CPM1
objectClass: CPM2
objectClass: CPM3
objectClass: CPM4
objectClass: CPZ
objectClass: CP04s
objectClass: CP0A
objectClass: CP11
entryDS: 1
nodeId: 21
createTimestamp: 20211014155438Z
modifyTimestamp: 20220313041228Z
MSISDN: 353834079137
IMSI: 272050103105233
NAM: 0
CDC: 1423
IMEISV:: U1RQJgAkQiE=
AUTHINFO: 0
CSP: 11
SUBSCSPVERS: 20
RSA: 20
SUBSRSAVERS: 19
APNID1: 4

每次找到文本 IMEISV:: 时,我都想用以下函数的结果替换该文件中 IMEISV:: 之后的值(在本例中为 U1RQJgAkQiE=):

base64 -d | od -t x8 -An | rev

如果我在 unix 中这样做,回声将是这样的:

echo U1RQJgAkQiE= | base64 -d | od -t x8 -An | rev

结果将是 3545056200422412

所以在文件的最后,值 U1RQJgAkQiE= 应该是 3545056200422412。像这样:

objectClass: CPM1
objectClass: CPM2
objectClass: CPM3
objectClass: CPM4
objectClass: CPZ
objectClass: CP04s
objectClass: CP0A
objectClass: CP11
entryDS: 1
nodeId: 21
createTimestamp: 20211014155438Z
modifyTimestamp: 20220313041228Z
MSISDN: 353834079137
IMSI: 272050103105233
NAM: 0
CDC: 1423
IMEISV:: 3545056200422412
AUTHINFO: 0
CSP: 11
SUBSCSPVERS: 20
RSA: 20
SUBSRSAVERS: 19
APNID1: 4

有人可以让我知道如何使用 sed/perl ...吗?我真的是unix的新手

sed perl
  • 4 4 个回答
  • 516 Views

4 个回答

  • Voted
  1. Best Answer
    steeldriver
    2022-03-24T07:59:02+08:002022-03-24T07:59:02+08:00

    怎么样

    unpack("h*", decode_base64($_))
    

    decode_base64perlMIME模块提供的位置,例如:

    $ perl -MMIME::Base64 -pe 's/IMEISV:: \K(.*)$/unpack("h*", decode_base64($1))/e' test.txt
    objectClass: CPM1
    objectClass: CPM2
    objectClass: CPM3
    objectClass: CPM4
    objectClass: CPZ
    objectClass: CP04s
    objectClass: CP0A
    objectClass: CP11
    entryDS: 1
    nodeId: 21
    createTimestamp: 20211014155438Z
    modifyTimestamp: 20220313041228Z
    MSISDN: 353834079137
    IMSI: 272050103105233
    NAM: 0
    CDC: 1423
    IMEISV:: 3545056200422412
    AUTHINFO: 0
    CSP: 11
    SUBSCSPVERS: 20
    RSA: 20
    SUBSRSAVERS: 19
    APNID1: 4
    
    • 3
  2. K-att-
    2022-03-24T08:26:40+08:002022-03-24T08:26:40+08:00

    sed 's/\(IMEISV::\)\(.*\)/echo -n \1" ";echo \2\| base64 -d \| od -t x8 -An\|rev /ge ' input.txt

    诀窍是 e 开关。输出:

    objectClass: CPM1
    objectClass: CPM2
    objectClass: CPM3
    objectClass: CPM4
    objectClass: CPZ
    objectClass: CP04s
    objectClass: CP0A
    objectClass: CP11
    entryDS: 1
    nodeId: 21
    createTimestamp: 20211014155438Z
    modifyTimestamp: 20220313041228Z
    MSISDN: 353834079137
    IMSI: 272050103105233
    NAM: 0
    CDC: 1423
    IMEISV:: 3545056200422412 
    AUTHINFO: 0
    CSP: 11
    SUBSCSPVERS: 20
    RSA: 20
    SUBSRSAVERS: 19
    APNID1: 4
    
    • 3
  3. HatLess
    2022-03-24T08:17:54+08:002022-03-24T08:17:54+08:00

    使用的一个想法 sed是在sed替换中执行上面的命令,printf以打印到第一个匹配的组而无需换行。

    $ sed "s/\(IMEISV::\)\(.*\)/printf '\1 ' ; echo \2 | base64 -d | od -t x8 -An | rev/e" input_file
    objectClass: CPM1
    objectClass: CPM2
    objectClass: CPM3
    objectClass: CPM4
    objectClass: CPZ
    objectClass: CP04s
    objectClass: CP0A
    objectClass: CP11
    entryDS: 1
    nodeId: 21
    createTimestamp: 20211014155438Z
    modifyTimestamp: 20220313041228Z
    MSISDN: 353834079137
    IMSI: 272050103105233
    NAM: 0
    CDC: 1423
    IMEISV:: 3545056200422412
    AUTHINFO: 0
    CSP: 11
    SUBSCSPVERS: 20
    RSA: 20
    SUBSRSAVERS: 19
    APNID1: 4
    
    • 2
  4. guest_7
    2022-03-30T09:28:04+08:002022-03-30T09:28:04+08:00
    #------------------
    #  base64 in sed
    #------------------
    set -u
    
    #> format string printf
    fmt='%s%s\n'
    
    #> bit, sextet, & octet regex
    bit='[01]'
    sextet="${bit}{6}"
     octet="${bit}{8}"; byte=$octet
    
    #> base64 charset
    b64='/[:alnum:]+'
    declare -a b64_chars=({A..Z} {a..z} {0..9} + /)
    
    #> user-defined helper function(s)
    oneLine() {
      # collapse stdin into one line
      paste -sd'\0' -
    }
    
    esc_rhs() {
      # make stdin pkuggable
      # on the rhs of a s///
      sed -e '
        s:[\/&]:\\&:g
        $!s:$:\\:
      ' -
    }
    
    dec2bin() {
      # create an array of size 2^$1
      # Usage: dec2bin 6
      # creates array d2b as:
      # underscore for clarity only
      # $d2b[0] => "000_000"
      # $d2b[1] => "000_001"
      #        ...
      # $d2b[63] => "111_111"
    
      eval "d2b=($(yes '{0,1}' | sed "$1q" | oneLine))"
    }
    
    #> build the encoding lookup table
    encode_tbl=$(printf '%s\n' "$(
    dec2bin 6
    i=0
    for c in "${b64_chars[@]}"
    do
      printf "$fmt" "$c" "${d2b[$i]}"
      (( i++ ))
    done
    )" | esc_rhs)
    
    #> build the decoding lookup table
    decode_tbl=$(printf '%s\n' "$(
    dec2bin 8
    for dec in {0..255}
    do
      hex=$(printf '%02x' "$dec")
      bin=${d2b[$dec]}
      printf "$fmt" "$bin" "$hex"
    done
    )" | esc_rhs)
    
    #######> main()
    sed -E "
      s/^IMEISV::\s*//;t base64
      b
      :base64
      s/[^${b64}]//g
      /^\$/d
      H;z;x;G
    
      s/\$/$encode_tbl/
      :encode
      /\n\n/!{
        s/((\n)[${b64}])(.*\1(${sextet}))/\4\2\3/
        b encode
      }
    
      s/\n.*//;:pad
      /^(${octet})+\$/!{
        s/\$/0/;b pad
      }
      # chunk it in 8-bit portions
      s/(${octet})/& /g
      G;s/\$/${decode_tbl}/;t decode
      :decode
        s/(${octet}) (.*\n\1([[:xdigit:]]{2}))/\3\2/
      t decode
    
      s/\n.*//
      s/([[:xdigit:]])([[:xdigit:]])/\2\1/g
      s/00?\$//
      s/^/IMEISV:: /
    " file
    
    • 1

相关问题

  • Linux grep文件1中的内容在文件2中[重复]

  • 如何在第三个逗号后用条件grep行

  • 根据第一个逗号之前的匹配删除重复行数

  • 如何改进这个字符转换脚本?

  • 如何删除两行之间的单行

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve