包含插入符号的Awk多字符字段分隔符未按预期工作

包含插入符号的Awk多字符字段分隔符未按预期工作,awk,Awk,我已经尝试了多个谷歌搜索,但没有一个建议的答案适用于我下面的例子。NF应该是3,但我一直得到1 # cat a 1^%2^%3 # awk -F^% '{print NF}' a 1 # awk -F'^%' {print NF}' a 1 awk -F "^%" {print NF}' a 1 awk中的-F变量采用正则表达式作为其值。因此,值^被解释为一个特殊的锚正则表达式模式,需要取消它的特殊含义。因此,您可以使用一个反斜杠\字符对其进行转义 awk -F'\\^%' '{ print

我已经尝试了多个谷歌搜索,但没有一个建议的答案适用于我下面的例子。NF应该是3,但我一直得到1

# cat a
1^%2^%3
# awk -F^% '{print NF}' a
1
# awk -F'^%' {print NF}' a
1
awk -F "^%" {print NF}' a
1
awk中的-F变量采用正则表达式作为其值。因此,值^被解释为一个特殊的锚正则表达式模式,需要取消它的特殊含义。因此,您可以使用一个反斜杠\字符对其进行转义

awk -F'\\^%' '{ print NF }'
从中寻找转义序列

反斜杠字符本身是另一个不能正常包含的字符;必须写入\\才能在字符串或regexp中加一个反斜杠。因此,必须写入内容为两个字符和\的字符串

awk中的-F变量采用正则表达式作为其值。因此,值^被解释为一个特殊的锚正则表达式模式,需要取消它的特殊含义。因此,您可以使用一个反斜杠\字符对其进行转义

awk -F'\\^%' '{ print NF }'
从中寻找转义序列

反斜杠字符本身是另一个不能正常包含的字符;必须写入\\才能在字符串或regexp中加一个反斜杠。因此,必须写入内容为两个字符和\的字符串

您应该转义“^”,以删除其特殊含义,该含义被字段分隔符用作正则表达式。一旦通过“\\”转义“^”,它将被视为普通/文字字符,然后“^%将被视为字符串,您将得到3的答案

awk -F'\\^%' '{print NF}' Input_file
这里有一个很好的SO链接,为了更好地理解,您也可以将其作为一个示例,它并没有专门讨论^character,而是讨论了如何在awk中的字段分隔符中使用转义序列

您应该转义“^”,以删除其特殊含义,该含义被字段分隔符用作正则表达式。一旦通过“\\”转义“^”,它将被视为普通/文字字符,然后“^%将被视为字符串,您将得到3的答案

awk -F'\\^%' '{print NF}' Input_file
这里有一个很好的SO链接,为了更好地理解,您也可以将其作为一个示例,它并没有专门讨论^character,而是讨论了如何在awk中的字段分隔符中使用转义序列


这是可行的,但只适用于双反斜杠,双反斜杠的用途是什么?我在胡萝卜前面用了一个反斜杠,但没有成功。@usao,\\意味着我们要让awk的字段分隔符知道后面的字符是文字字符,不应该被视为正则表达式模式。通常在正则表达式模式匹配中使用“^”,例如->^var意味着如果某个东西以“^”开头,但这里不是这样,因为您的文件以字母形式包含它,因此我们需要对其进行转义。这是有效的,但只适用于双反斜杠,双反斜杠的用途是什么?我在胡萝卜前面用了一个反斜杠,但没有成功。@usao,\\意味着我们要让awk的字段分隔符知道后面的字符是文字字符,不应该被视为正则表达式模式。通常在正则表达式模式匹配中使用“^”,例如->^var意味着如果某个东西以“^”开头,但在这里情况并非如此,因为您的文件将其作为字母,因此我们需要对其进行转义。