Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
sed和it';s regex用于可选符号_Regex_Sed - Fatal编程技术网

sed和it';s regex用于可选符号

sed和it';s regex用于可选符号,regex,sed,Regex,Sed,我正在编写一个脚本,用于根据提示列表将大FLAC音频文件拆分为小块。我使用cueprint来确定标记信息,但在某些情况下,它不能提供我需要的信息,我需要使用sed直接从cue文件中挖掘信息。现在我在和类型的东西作斗争。它的问题在于它以不同的方式出现: REM GENRE "Gothic" REM GENRE Gothic 两者似乎都是标准的,但很难解析。 第二种情况类似于 sed -nr -e "s/^(REM GENRE )(.*)\r/\2/p" *.cue 完美地工作并按预期返回。但对

我正在编写一个脚本,用于根据提示列表将大FLAC音频文件拆分为小块。我使用cueprint来确定标记信息,但在某些情况下,它不能提供我需要的信息,我需要使用sed直接从cue文件中挖掘信息。现在我在和类型的东西作斗争。它的问题在于它以不同的方式出现:

REM GENRE "Gothic"
REM GENRE Gothic
两者似乎都是标准的,但很难解析。 第二种情况类似于

sed -nr -e "s/^(REM GENRE )(.*)\r/\2/p" *.cue
完美地工作并按预期返回。但对于第一个案例,“哥特式”是返回的,这不是我不想做的。 在正则表达式的第一部分和第三部分中,您会说“使用”可选的引号,如下所示

sed -nr -e "s/^(REM GENRE \"?)(.*)\"?\r/\2/p" *.cue
但这并不像预期的那样有效,结果是

Gothic"
带有尾随的双引号

<如何>用SED?

< P> > > < <代码>(*)>代码>将中间的代码> >([^)] * /代码>以排除引号。

< P>更改<代码>(*)> <代码>中间>代码>([^)] /代码>以排除引号。

可以使用这个,

sed -nr -e 's/^(REM GENRE )"?([^"\r]*)/\2/p' *.cue
你可以用这个

sed -nr -e 's/^(REM GENRE )"?([^"\r]*)/\2/p' *.cue

sed
非常匹配。当您匹配
(.*)?
时,
*
匹配
哥特式“
”?
匹配空字符串。您必须从
*
字符串中排除双引号,例如

sed -nr 's/^REM GENRE "?([^"]*)"?\r?/\1/p' *.cue
请注意,这将导致带引号的字符串出现问题,如
“哥特\“ic”
。为避免此问题,需要使用更大的枪。我建议

sed -nr '/^REM GENRE "?(([^"]|\\")*)"?\r?/ { s//\1/; s/\\"/"/g; p; }'
就是

/^REM GENRE "?(([^"]|\\")*)"?\r?/ {   # if a line contains the pattern
  s//\1/                              # isolate the capturing group
  s/\\"/"/g                           # unescape quotes
  p                                   # then print.
}

请注意正则表达式中匹配非引号字符和转义引号的
([^“]\\”*

sed
非常匹配。当匹配
(.*)?
时,
*
匹配
哥特式“
”?
匹配空字符串。您必须从
*
字符串中排除双引号,例如

sed -nr 's/^REM GENRE "?([^"]*)"?\r?/\1/p' *.cue
请注意,这将导致带引号的字符串出现问题,如
“哥特\“ic”
。为避免此问题,需要使用更大的枪。我建议

sed -nr '/^REM GENRE "?(([^"]|\\")*)"?\r?/ { s//\1/; s/\\"/"/g; p; }'
就是

/^REM GENRE "?(([^"]|\\")*)"?\r?/ {   # if a line contains the pattern
  s//\1/                              # isolate the capturing group
  s/\\"/"/g                           # unescape quotes
  p                                   # then print.
}

请注意正则表达式中匹配非引号字符和转义引号的
([^“]\\”*

非常好。但不适用于带引号的单词:
REM流派“哥特式”“单词”
这是真的。cueprint格式允许这种事情吗?嗯,我不认为类似“哥特式”“摇滚乐”的东西是“可期待的”“在这种情况下,我甚至不认为像哥特\”ic这样的东西是我在那里看到过的东西。所以,两个建议的答案都会非常有效。非常好。但对引用的单词不起作用:
REM体裁“哥特式”“单词”
是真的。cueprint格式允许这样的事情吗?嗯,我不认为像“哥特式”“摇滚”这样的东西是”“在这种情况下,我甚至不认为像哥特”这样的ic是我在那里看到的东西。因此,这两个建议的答案都将非常有效。