linux - 在awk中将中文翻译成urlencoding

标签 linux shell awk url-encoding

我有一个 .txt 文件。而且每一行都有中文。我想把中文翻译成urlencoding。

我怎样才能得到它?

txt.文件

http://wiki.com/    中文
http://wiki.com/    中国

目标文件

http://wiki.com/%E4%B8%AD%E6%96%87
http://wiki.com/%E4%B8%AD%E5%9B%BD

我找到了一个 shell 脚本方法来处理它:

echo '中文' | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g' | tr '[a-z]' '[A-Z]'

所以,我想像这样将它嵌入 awk,但我失败了:

awk -F'\t' '{
    a=system("echo '"$2"'| tr -d '\n' | xxd -plain | \
    sed 's/\(..\)/%\1/g' | tr '[a-z]' '[A-Z]");

    print $1a
}' txt.file

我试过另一种方法写一个外部函数并在 awk 中调用它,像这样的代码,再次失败。

zh2url()
{
   echo $1 | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g' | tr '[a-z]' '[A-Z]'
}
export -f zh2url
awk -F'\t' "{a=system(\"zh2url $2\");print $1a}" txt.file

请用 awk 命令实现它,因为我实际上还有另一件事需要同时在 awk 中处理。

最佳答案

使用 GNU awk 进行协同处理等:

$ cat tst.awk
function xlate(old,     cmd, new) {
    cmd = "xxd -plain"
    printf "%s", old |& cmd
    close(cmd,"to")
    if ( (cmd |& getline rslt) > 0 ) {
        new = toupper(gensub(/../,"%&","g",rslt))
    }
    close(cmd)
    return new
}
BEGIN { FS="\t" }
{ print $1 xlate($2) }

$ awk -f tst.awk txt.file
http://wiki.com/%E4%B8%AD%E6%96%87
http://wiki.com/%E4%B8%AD%E5%9B%BD

关于linux - 在awk中将中文翻译成urlencoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30485772/

相关文章:

arrays - 为什么 awk 似乎随机化数组?

linux - SaltStack - 更改文件权限

linux - 可以让子进程在新终端上运行吗

shell - 字符大小写转换 大写到小写,反之亦然

linux - 如何在linux shell中匹配带有特殊字符的子字符串?

shell - 如何在shell脚本中调用函数?

bash - Awk/Find/Grep - 如果文件中存在 $3

c# - 如何在 monodevelop 中运行组合命令

c++ - Linux MinGW : on compiling he output list of 8 "nultiple definitions"

linux - 使用 awk 和行首正则表达式获取段落