(export LC_ALL=C; xxd -revert -plain < 1234abcd | rev | tr -d '\n' | xxd -plain | tr -d '\n') 为什么不起作用?

(export LC_ALL=C; xxd -revert -plain < 1234abcd | rev | tr -d '\n' | xxd -plain | tr -d '\n') 为什么不起作用?
(export LC_ALL=C; xxd -revert -plain <<< 1234abcd | rev | tr -d '\n' | xxd -plain | tr -d '\n')
rev: stdin: Invalid or incomplete multibyte or wide character

其最返回cdab3412

但返回

rev: stdin: Invalid or incomplete multibyte or wide character

如何解决这个问题?

答案1

如果系统rev无法将字节序列作为字符处理,也许可以尝试 perl:

$ (export LC_ALL=C; xxd -revert -plain <<< 1234abcd | perl -pe '$_ = reverse $_' | xxd -plain)
cdab3412

我省略了换行符删除 - 它们似乎没有必要。

答案2

echo 1234abcd | grep -o .. | tac | paste -sd '' -

cdab3412

答案3

使用revsed

$ rev <<< 1234abcd | sed -E 's/(.)(.)/\2\1/g'
cdab3412

awk

$ awk -F '' '{ for(i=NF-1;i>0;i-=2) printf "%s", $i $(i+1) } END{ print "" }' <<< 1234abcd
cdab3412

答案4

替换rev为以下一行:

perl -nle 'print scalar reverse $_'

来源:Perl 一行行

至少它不会因无效编码而中断。

为了更方便使用,创建以下别名:

alias reverse="perl -nle 'print scalar reverse \$_'"

相关内容