Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex awk:致命:设置多个字段分隔符时正则表达式无效_Regex_Awk_Gawk - Fatal编程技术网

Regex awk:致命:设置多个字段分隔符时正则表达式无效

Regex awk:致命:设置多个字段分隔符时正则表达式无效,regex,awk,gawk,Regex,Awk,Gawk,我试图用awk解决这个问题。该问题包含一个字符串XXXXXX[yyyy--ZZZZZ,OP希望在文本中唯一的[和--字符串之间打印文本 如果它只是一个-,我会说使用[-[]作为(FS)。这是将FS设置为-或[: $ echo "XXXXXXX[YYYYY-ZZZZ" | awk -F[-[] '{print $2}' YYYYY 棘手的一点是,[作为字符类也有一个特殊的含义,因此要使它正确地解释为可能的FS之一,它不能写在第一个位置。这是通过说[-[-[]来实现的。所以我们要匹配-或[ 但是,

我试图用
awk
解决这个问题。该问题包含一个字符串
XXXXXX[yyyy--ZZZZZ
,OP希望在文本中唯一的
[
--
字符串之间打印文本

如果它只是一个
-
,我会说使用
[-[]
作为(FS)。这是将FS设置为
-
[

$ echo "XXXXXXX[YYYYY-ZZZZ" | awk -F[-[] '{print $2}'
YYYYY
棘手的一点是,
[
作为字符类也有一个特殊的含义,因此要使它正确地解释为可能的FS之一,它不能写在第一个位置。这是通过说
[-[-[]
来实现的。所以我们要匹配
-
[

但是,在本例中,它不是一个连字符而是两个连字符:我想说
-->
[
。我不能说
[-[]
,因为连字符还具有定义范围的含义

我能做的就是使用
-F“一种模式|另一种模式”
如:

$ echo "XXXXXXXaaYYYYYbbZZZZ" | awk -F"aa|bb" '{print $2}'
YYYYY
因此,如果我尝试将其与
--
[
一起使用,则无法得到正确的结果:

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F"--|[" '{print $2}'
awk: fatal: Invalid regular expression: /--|[/
事实上,甚至没有
[
作为术语之一:

$ echo "XXXXXXX[YYYYYbbZZZZ" | awk -F"bb|[" '{print $2}'
awk: fatal: Invalid regular expression: /bb|[/

$ echo "XXXXXXX[YYYYYbbZZZZ" | awk -F"bb|\[" '{print $2}'
awk: warning: escape sequence `\[' treated as plain `['
awk: fatal: Invalid regular expression: /bb|[/

$ echo "XXXXXXX[YYYYYbbZZZZ" | awk -F"(bb|\[)" '{print $2}'
awk: warning: escape sequence `\[' treated as plain `['
awk: fatal: Unmatched [ or [^: /(bb|[)/
你看,我尝试过转义
[
,用括号括起来,但没有任何效果


因此:如何将字段分隔符设置为
--
[
?是否有可能?

您需要使用双反斜杠来转义双引号字符串中的正则表达式元字符,以便将其视为正则表达式元字符,否则(如果使用单反斜杠),它将被视为ecape序列

$ echo 'XXXXXXX[YYYYYbbZZZZ' | awk -v FS="bb|\\[" '{print $2}'
YYYYY

您需要使用双反斜杠来转义双引号字符串中的正则表达式元字符,以便将其视为正则表达式元字符,否则(如果使用单反斜杠),它将被视为ecape序列

$ echo 'XXXXXXX[YYYYYbbZZZZ' | awk -v FS="bb|\\[" '{print $2}'
YYYYY

这与GNU Awk 3.1.7有关

echo "XXXXXXX[YYYYY--ZZZZ" | awk -F"--|[[]" '{print $2}'    
echo "XXXXXXX[YYYYYbbZZZZ" | awk -F"bb|[[]" '{print $2}'

这与GNU Awk 3.1.7有关

echo "XXXXXXX[YYYYY--ZZZZ" | awk -F"--|[[]" '{print $2}'    
echo "XXXXXXX[YYYYYbbZZZZ" | awk -F"bb|[[]" '{print $2}'

IMHO如果我们从split()命令使用的regexp开始,就可以很好地解释这一点,因为它显式地显示了当使用文本与动态regexp将字符串拆分为字段时发生的情况,然后我们可以将其与字段分隔符相关联

这使用一个文本regexp(由
/
s分隔):

因此需要对
[
进行转义,因此它是字面意义上的,因为
[
是一个regexp元字符

它们使用动态regexp(存储为字符串的):

因此需要对
[
进行两次转义,因为awk必须将包含regexp的字符串(在最后两个示例中是一个名为
re
的变量)转换为regexp(使用了一个反斜杠),然后再将其用作split()调用中的分隔符(使用了第二个反斜杠)

这:

将变量内容公开给shell进行求值,因此需要对
[
进行三次转义,因为shell首先解析字符串以尝试展开shell变量等(使用一个反斜杠),然后awk必须将包含regexp的字符串转换为regexp(使用第二个反斜杠)在split()调用中将其用作分隔符之前(该调用将使用第三个反斜杠)

字段分隔符只是一个存储为名为FS的变量的regexp(如上面的
re
),具有一些额外的语义,因此上面的所有内容都适用于它,因此:

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F '\\[|--' '{print $2}'
YYYYY

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F "\\\[|--" '{print $2}'
YYYYY
请注意,我们可以使用括号表达式,而不是转义它,以便按字面意思处理
[

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk '{split($0,f,/[[]|--/); print f[2]}'
YYYYY
然后,当我们添加解析层时,就不必担心转义:

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F "[[]|--" '{print $2}'
YYYYY

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F '[[]|--' '{print $2}'
YYYYY

IMHO如果我们从split()命令使用的regexp开始,就可以很好地解释这一点,因为它显式地显示了当使用文本与动态regexp将字符串拆分为字段时发生的情况,然后我们可以将其与字段分隔符相关联

这使用一个文本regexp(由
/
s分隔):

因此需要对
[
进行转义,因此它是字面意义上的,因为
[
是一个regexp元字符

它们使用动态regexp(存储为字符串的):

因此需要对
[
进行两次转义,因为awk必须将包含regexp的字符串(在最后两个示例中是一个名为
re
的变量)转换为regexp(使用了一个反斜杠),然后再将其用作split()调用中的分隔符(使用了第二个反斜杠)

这:

将变量内容公开给shell进行求值,因此需要对
[
进行三次转义,因为shell首先解析字符串以尝试展开shell变量等(使用一个反斜杠),然后awk必须将包含regexp的字符串转换为regexp(使用第二个反斜杠)在split()调用中将其用作分隔符之前(该调用将使用第三个反斜杠)

字段分隔符只是一个存储为名为FS的变量的regexp(如上面的
re
),具有一些额外的语义,因此上面的所有内容都适用于它,因此:

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F '\\[|--' '{print $2}'
YYYYY

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F "\\\[|--" '{print $2}'
YYYYY
请注意,我们可以使用括号表达式,而不是转义它,以便按字面意思处理
[

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk '{split($0,f,/[[]|--/); print f[2]}'
YYYYY
然后,当我们添加解析层时,就不必担心转义:

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F "[[]|--" '{print $2}'
YYYYY

$ echo "XXXXXXX[YYYYY--ZZZZ" | awk -F '[[]|--' '{print $2}'
YYYYY

目前使用,<代码>awk-F(bb 124\\\\[除了除了“{印刷$2}”a或者<代码>awk-v-P>或者<代码>awk-v<使用,<代码>awk-a使用,<代码>awk-F-F使用,<代码>awk-awk-awk-a(bb)a或者<代码>awk-v<代码>awk-v-v-v<代码>或者<代码>awk-v-v-v<代码>或者<-FKKKKKKK-v-v-v-v-v-Fbbbbbbk-v-v-Fspan span span<<代码>或者<<-v<代码>或者<-v<代码>或者<-v<代码>域名域名域名域名域名域名<-v-v-Fbbbbbk-v-v-v-FFFFF{打印$2}'a或
awk-vfs=“bb | \[”{print$2}'a
和ans为他发送的
echo”消息[M0AO40PXPW--'| awk-vfs=“\[\\\\[\\\'{print$4}
echo”消息发送[M0AO40PXPW--''awk-v=“'FS\[\[\++'{print$2}'{print$2}'
你使用的是什么版本的awk?我的代码<4.0>得到两行错误代码-