例如,我需要将 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
,从而使在程序中使用它变得更加困难。有两种方法可以避免该问题:
- 不要将程序
awk
作为字符串传递,而是将其写入文件(假设我们将其称为substitution.awk
),然后awk
使用-f
参数运行以将其指向该文件(即awk -f substition.awk
)。这将释放单引号作为字符串终止符,以便您可以在程序中使用它。 两者
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