从 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)。
我想从 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)。