如何在传递的变量中转义空格等,以便系统调用 awk 中的 cp

如何在传递的变量中转义空格等,以便系统调用 awk 中的 cp

这个问题有足够多的复杂性,使得简单的转义字符对我来说很困难。我有一个 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

相关内容