代码之家  ›  专栏  ›  技术社区  ›  MOHAMED

如何将字符串插入到每一对字符的长字符串中

  •  -1
  • MOHAMED  · 技术社区  · 5 年前

    我有一个长字符串,它描述了一个长十六进制消息,如下所示:

    "010203040F1013"
    

    我想把它改成这个

    "0x01, 0x02, 0x03, 0x04, 0x0F, 0x10, 0x13"
    

    有使用sed/awk的linux命令/脚本吗?

    3 回复  |  直到 5 年前
        1
  •  -1
  •   Yuji    5 年前

    一条线就能搞定。

    echo "010203040F1013" | grep -o ".." | sed 's/^/0x/' | sed 's/$/, /' | awk '{ str = str $0 }END{ print str}' | sed 's/, $//'
    
        2
  •  1
  •   Ed Morton    5 年前
    $ echo "010203040F1013" | awk '{gsub(/../,", 0x&"); sub(/, /,"")}1'
    0x01, 0x02, 0x03, 0x04, 0x0F, 0x10, 0x13
    
        3
  •  0
  •   James Brown    5 年前

    一个在Perl中,使用负lookahead跳过结尾的逗号:

    $ perl -p -e 's/([0-9A-F]{2})/0x\1/g;s/([0-9A-F]{2})(?!")/\1, /g' file
    "0x01, 0x02, 0x03, 0x04, 0x0F, 0x10, 0x13"
    
        4
  •  0
  •   RavinderSingh13 Nikita Bakshi    5 年前

    你能试试下面的吗?

    awk '
    BEGIN{
      OFS=","
      s1="\""
    }
    {
      count=1
      while(count<=length($0)){
        val=(val?val OFS:"")sprintf("0x%d",substr($0,count,2))
        count+=2
      }
      print s1 val s1
      val=""
    }
    '  Input_fie
    
        5
  •  0
  •   Cyrus    5 年前

    带GNU AWK:

    echo "010203040F1013" | awk '$1="0x"$1' FPAT='..' OFS=', 0x'
    

    输出:

    0x01, 0x02, 0x03, 0x04, 0x0F, 0x10, 0x13
    
        6
  •  0
  •   Sundeep    5 年前
    $ echo '010203040F1013' | perl -lne 'print join ", " , map { "0x$_" } /../g'
    0x01, 0x02, 0x03, 0x04, 0x0F, 0x10, 0x13
    

    这个函数使用 /../g 然后使用 map 转换每个匹配的部分。最后,通过将元素与所需分隔符连接来打印新数组。

    $ echo '010203040F1013' | perl -pe 's/../0x$&, /g; s/, $//'
    0x01, 0x02, 0x03, 0x04, 0x0F, 0x10, 0x13
    $ echo '010203040F1013' | sed 's/../0x&, /g; s/, $//'
    0x01, 0x02, 0x03, 0x04, 0x0F, 0x10, 0x13
    

    这里,替换用于每两个字符转换一次,然后使用另一个替换移除最后的分隔符