从 windows 批处理文件调用 gawk -v pwd=%cd% 时,我丢失了斜杠

When calling gawk -v pwd=%cd% from windows batch file I lose the slashes

我想从 windows 脚本(批处理文件)调用 awk/gawk 脚本。

我也想传入当前目录。所以我有以下行:

gawk -v pwd=%cd% -f myscript.awk sometextfiletoprocess.txt

在批处理文件中,如果我这样做 echo %cd% 我会得到 "c:\dev\work\PIC\"

但在 awk 脚本中,我在开头有以下内容:

BEGIN {
    print "pwd: " pwd
}

这给出了输出 "c:devworkPIC" - 所以你可以看到我丢失了所有的斜线。我猜 awk 不喜欢“\”?我怎样才能恢复我的斜杠?

编辑 我尝试在 %cd% 周围使用引号:gawk -v pwd="%cd%" -f myscript.awk sometextfiletoprocess.txt。这没有效果:(

-v 解释转义序列(参见 http://cfajohnson.com/shell/cus-faq-2.html#Q24)所以我猜这就是导致您出现问题的原因。

如果你想要任何东西,包括转义,按字面意思传递给 awk,那么你应该使用 ENVIRON:

pwd="\foo\bar" awk 'BEGIN{pwd=ENVIRON["pwd"]; ...}'

或将其作为参数与文件名一起传递:

awk 'BEGIN{pwd=ARGV[2]; ARGV[2]=""; ARGC--; ...}' file "\foo\bar"

例如:

$ cat tst.awk
BEGIN {
    print "pwd1:", pwd1

    print "---"

    pwd2=ENVIRON["pwd2"]
    print "pwd2:", pwd2

    print "---"

    pwd3=ARGV[ARGC-1]; ARGV[ARGC-1]=""; ARGC--
    print "pwd3:", pwd3
}

$ pwd2='c:\dev\work\PIC\' awk -v pwd1='c:\dev\work\PIC\' -f tst.awk 'c:\dev\work\PIC\'
awk: warning: escape sequence `\d' treated as plain `d'
awk: warning: escape sequence `\w' treated as plain `w'
awk: warning: escape sequence `\P' treated as plain `P'
pwd1: c:devworkPIC\
---
pwd2: c:\dev\work\PIC\
---
pwd3: c:\dev\work\PIC\

修改上述 UNIX 语法以执行正确的 Windows 咒语(或者更好的 install/use cygwin)。