简体   繁体   中英

How to turn a string into a modified hex representation?

i want to turn a string like

AaAa

into

a string like this

%<41>%<61>%<41>%<61>

Simple enough with the programming languages i am familar with, but with bash i can't get get the piping right to do what i am trying to do:

  • split string into char array
  • turn each char into hex
  • wrap each hex value into %<FF>
  • concat string

this is my current way which gets me half way there:

echo -n "AaAa" | od -A n -t x1

If you are already using od ,

printf "%%<%s>" $(od -A n -t x1<<<"AaAa")

For an all-bash without od ,

while read -r -N 1 c; do printf "%%<%02X>" "$( printf "%d" \'$c )"; done <<< AaAa

The downside of this approach is that it spawns a subshell for every character, and assumes ASCII/UTF8.


edit

@Shawn pointed out that you don't need the subshell -

while read -r -N 1 c; do printf "%%<%02X>" \'$c; done <<< AaAa

I noticed that these are leaving the string terminator in your output, though, and realized I could eliminate that and the read by assigning the data to a variable and using the built-in parsing tools.

$: x=AaAa && for((i=0;i<${#x};i++)); do printf "%%<%02X>" \'${x:i:1}; done; echo
%<41>%<61>%<41>%<61>

A simple Perl substitution would do the trick:

echo -n AaAa | perl -pe's/(.)/ sprintf "%%<%02X>", ord($1) /seg'

Shorter:

echo -n AaAa | perl -ne'printf "%%<%02X>", $_ for unpack "C*"'

In both cases, the output is the expected

%<41>%<61>%<41>%<61>

(No trailing line feed added. If you want one, append ; END { print "\\n" } .)

You could use :

echo -n AaAa | perl -ne 'for $c (split//) { printf("%%<%02X>", ord($c)); }'

Output

%<41>%<61>%<41>%<61>

您可以通过管道传输到sed以将每个字节包装在%<> ,然后删除空格。

echo -n "AaAa" | od -A n -t x1 | sed -E -e 's/[a-z0-9]+/%<&>/g' -e 's/ //g'

Maybe awk

echo -n "AaAa" |
od -A n -t x1 |
awk 'BEGIN { ORS = "" } { for (i = 1; i <= NF; i+=1) print "%<"$i">"}'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM