如何在 awk 中替换 " ?

如何在 awk 中替换 " ?

例如,我需要将 a 更改为in 中的"单词quote

改变

a string with a " at some point

进入

a string with a quote at some point

我努力了:

$ echo 'a string with a " at some point' | awk 'sub(",quote)'
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1:     ^ unterminated string
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1:     ^ syntax error
$
$ echo 'a string with a " at some point' | awk 'sub(\",quote)'
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1:     ^ backslash not last character on line
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1:     ^ syntax error

然而

$ echo 'a string with a " at some point' |
  awk 'sub("string","rope")'

=>

a rope with a " at some point

适用于绳索词。

答案1

echo 'duck " cat' | sed 's/"/quote/'

或者在 中awk,由于sub采用正则表达式,因此使用通常的//形式将其标记为这样:

echo 'duck " cat' | awk 'sub(/"/,"quote")'

答案2

如果你想使用一个字符串,你必须用引号引起来。对于由字母字符组成的字符串(如字符串/绳索示例所示)来说是这样,对于元字符字符串(如双引号)也是如此。换句话说,sub (","quote")行不通的原因与sub (q,"quote")行不通的原因相同。

您需要确保双引号位于字符串终止符内。这会变得稍微困难​​一些,因为您已经在 shell 中使用单引号作为字符串终止符来将程序传递给awk,从而使在程序中使用它变得更加困难。有两种方法可以避免该问题:

  1. 不要将程序awk作为字符串传递,而是将其写入文件(假设我们将其称为substitution.awk),然后awk使用-f参数运行以将其指向该文件(即awk -f substition.awk)。这将释放单引号作为字符串终止符,以便您可以在程序中使用它。
  2. 两者awk和您的 shell 都支持反斜杠 ( \) 作为转义字符。使用它,您可以告诉 shellawk它不能以通常的方式解释下一个字符,但必须将其视为常规字符。换句话说,您可以执行以下任一操作:

    awk 'sub(\'"\',"quote")'
    

    或这个:

    awk 'sub("\"","quote")'
    

    在第一个示例中,您从 shell 中转义了两个单引号,以便awk看到它们;在第二个中,您从 中转义一个双引号awk,以便构建一个带有双引号的字符串。

答案3

echo 'a string with a " at some point' | awk -v dq=\" '{sub(dq,"quote")}1'

答案4

您可以使用八进制转义:

awk 'sub("\42", "quote")' <<'eof'
a string with a " at some point
eof

相关内容