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

Esc*_*her 5 awk shell-script quoting

这个问题有足够的复杂层,使简单的转义字符对我来说很困难。我有一个 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);
Run Code Online (Sandbox Code Playgroud)

cuo*_*glm 5

您可以使用:

awk '...
    cpJpegVariable="cp -r '\''" imageDirectory "'\'' assets";
    ...'
Run Code Online (Sandbox Code Playgroud)

(请注意,'不需要转义 for awk,但您需要转义'\''外壳)。所以当awk扩展 variable 时cpJpegVariable,它看起来像:

cp -r 'file_contain space' assets
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以避免所有特殊字符的问题,除了'它自己。如果imageDirectory可能包含单引号字符,您可以使用gsub(). 例子:

awk '{gsub("'\''","'\''\"'\''\"",imageDirectory)}1'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,虽然它修复了空格、制表符、;、|、& 和许多其他字符的问题,但它并没有修复包含反引号、反斜杠、`$` 或 `"` 字符(或其名称以 ` -`)。 (2认同)