【问题标题】:POSIX Shell Escape Quotes in Dynamic String动态字符串中的 POSIX Shell 转义引号
【发布时间】:2023-02-03 05:37:49
【问题描述】:

假设我有一个接受字符串并将其插入引号内的函数。

print_str() (
printf '"%s"\n' "$1" 
)

由于该函数将输入用双引号括起来,我想在参数中转义所有双引号(如果有的话)。但是,至关重要的是,已经转义的双引号前面必须有一个反斜杠。简而言之,该函数必须为参数中的所有双引号添加一层转义,无论是第一层还是附加层。

例子:

  • 'abc"def' -> 'abc\"def'
  • '{ "json": "{ \"key\": \"value\" }" }' -> '{ \"json\": \"{ \\\"key\\\": \\\"value\\\" }\" }'

对我来说棘手的部分是确定双引号前面的反斜杠是否实际上转义了双引号,因为,例如,在 '\\"' 中,反斜杠没有转义双引号,即使它紧接在双引号之前。

我考虑过使用 sed 并检查双引号前的反斜杠数量是奇数还是偶数,但这看起来很复杂。通过jq -R . 管道输入,我设法获得了我想要的解决方案,但我想知道是否还有另一种方法可以做到这一点。特别是,我正在寻找适用于 POSIX shell 的东西。

【问题讨论】:

  • 可悲的是,我认为没有任何 POSIX 定义的工具可以为您生成正确转义的带引号的字符串。 bash 内置 printf 支持 %q 转换说明符,作为处理此问题的 POSIX 扩展的一个示例。
  • 'abc"def' -> 'abc\"def'我不明白。

标签: string function sed sh posix


【解决方案1】:

你不需要数什么

sed 's/["]/\&/g; s/.*/"&"/'

【讨论】:

    【解决方案2】:

    通常,您将 ' 更改为 ''',并将 ' 放在开头和结尾。

    quotestr() { printf "'%s'" "$(printf "%s" "$1" | sed "s/'/'\\''/g")"; }
    

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2016-01-16
      • 2016-10-24
      相关资源
      最近更新 更多