打印字符串的“规范打印转义形式”

打印字符串的“规范打印转义形式”

我正在尝试编写一个函数,我称之为它escape,其行为如下:

% IFS=$' \t\n\000'
% escape FOO $IFS
FOO=$' \t\n\000'

换句话说,escape采用两个参数,然后将第一个参数作为变量名,它会打印出一行 a zsh源代码其中该名称的变量被分配一个$''带引号的“规范print转义”字符串,这样,在评估这行源代码时,第一个参数命名的变量将具有第二个参数作为其值。 (我确信这就像泥巴一样清晰,所以我将escape在这篇文章的末尾给出更多关于应该如何表现的例子。)

这是该函数的不完整实现escape

escape () {
    local varname=$1
    local value="$2"
    print -n "$varname=\$'"
    # ???
    print "'"
}

缺失的部分(由 表示???)是 的内容$value被“规范print转义”的地方。限定词“规范”是必要的,因为有许多字符至少有几种表示形式可以print将它们识别为。例如,也print知道\nas\012和 as \C-J。在本例中,\n是规范形式。一般来说,标准转义序列\n\r\t等是其对应字符的规范形式。可打印 ASCII 字符(例如A=、 )的标准显示形式9是规范的。对于其余字符,如果可以选择表示形式,我会选择八进制形式作为规范形式(至少直到\177;我不确定如何$''处理更高的代码),但这种偏好并不强。

当然,我并不希望看到“从头开始”实现此功能的代码。相反,我希望已经存在一个实用程序来执行从字节到print转义文本表示的转换。

任何指示将不胜感激!


以下是一些escape实际的例子(假设):

% escape HELLO $( echo 'hello world' )
HELLO=$'hello world\n'
% escape SUBSEP $( perl -e 'print $;' )
SUBSEP=$'\034'
% abc=$'\141\012\142\012\143\012'
% print -n $abc
a
b
c
% escape ABC $abc
ABC=$'a\nb\nc\n'

答案1

我想q 参数扩展标志,特别是qqqq变体。

FOO=${(qqqq)IFS}

因此,您可以这样编写函数(使用标志P来扩展名称为 的参数$2):

escape () {
  print -r -- "$1=${(Pqqqq)2}"
}

相关内容