这个问题有足够多的复杂性,使得简单的转义字符对我来说很困难。我有一个 bash 脚本,其中很大一部分有一个嵌入的 awk 脚本,该脚本读取由分号分隔的文件。在此文本文件中,字段之一是某些 JPEG 的目录路径。我想将 JPEG 复制到其他地方,但原始目录路径中有空格(并且可能有其他可能造成损坏的字符串)。我无法用单引号引用有问题的目录,因为这会停止 awk 解释器,而双引号会将其转换为 awk 中的文字字符串。
我正在使用 gawk 4.1.1。这是我想要完成的一些 awk 代码:
imageDirectory = $1;
cpJpegVariable="cp -r " imageDirectory " assets";
#screws up if imageDirectory has spaces and other naughty characters
system(cpJpegVariable);
答案1
您可以使用:
awk '...
cpJpegVariable="cp -r '\''" imageDirectory "'\'' assets";
...'
(请注意,'
不需要对 进行转义awk
,但需要'\''
对 shell 进行转义)。所以当awk
展开变量时cpJpegVariable
,它看起来像:
cp -r 'file_contain space' assets
这样,您就可以避免除'
自身之外的所有特殊字符的问题。如果imageDirectory
可能包含单引号字符,您可以使用 转义它们gsub()
。例子:
awk '{gsub("'\''","'\''\"'\''\"",imageDirectory)}1'
答案2
如果您将 Awk 变量传递给系统,你需要 shell 引用它:
function quote(str, d, m, x, y, z) {
d = "\47"; m = split(str, x, d)
for (y in x) z = z d x[y] d (y < m ? "\\" d : "")
return z
}
例子:
system(sprintf("cp -r %s assets", quote($1)))
答案3
执行外部命令是针对 shell 的,而不是针对 awk 的:
while read image_dir __; do
cp -r "$image_dir" assets
done < file