Regex 如何在特殊字符{和\之间找到模式?
我一直在学习如何通过zLinux控制台使用z/VM。我已经向z/VM客户发送了一个CMS命令,并将输出返回到zLinux上的一个文件。现在剩下的就是清理文件并通过模式提取正确的日期 我注意到该文件包含{和a\之间的正确数据。该模式以{开头,以a结尾。请参见下面的示例 示例:Regex 如何在特殊字符{和\之间找到模式?,regex,awk,sed,Regex,Awk,Sed,我一直在学习如何通过zLinux控制台使用z/VM。我已经向z/VM客户发送了一个CMS命令,并将输出返回到zLinux上的一个文件。现在剩下的就是清理文件并通过模式提取正确的日期 我注意到该文件包含{和a\之间的正确数据。该模式以{开头,以a结尾。请参见下面的示例 示例: &{HELLO WORLD TEST 123 \INMR06 有很多这样的行,我尝试使用以下命令提取模式: awk-F“[{\]”“{print$2}”TMPCMS 结果:你好世界测试123\INMR06 aw
&{HELLO WORLD TEST 123 \INMR06
有很多这样的行,我尝试使用以下命令提取模式:
awk-F“[{\]”“{print$2}”TMPCMS
结果:你好世界测试123\INMR06
awk-F“[{\\]”“{print$2}”TMPCMS
结果:awk:警告:转义序列被视为普通
*HELLO WORLD TEST 123 \INMR06*
OP的代码修复:很好的尝试,你很接近了。如果你在字段分隔符中正确转义
\
字符,你就可以完成。用GNUawk
中显示的示例编写和测试
awk -F'{| \\\\' '{print $2}' Input_file
奖金解决方案:您可以使用awk
的match
功能在{
到\
之间进行匹配:
awk 'match($0,/{[^\\]*/){print substr($0,RSTART+1,RLENGTH-1)}' Input_file
您可以通过以下命令使用
sed
:
sed -n 's/^[^{]*{\(.*\)\\[^\\]*$/\1/p' TMPCMS
看一看
-n
选项抑制默认行输出,模式匹配
-字符串的开头^
-除[^{]*
{
-a{
字符{
-第1组:任何零个或多个字符\(.*)
-a\\
字符\
-除[^\\]*
\
-字符串结尾$
\1
替换仅保留组1的值,并且p
选项打印该值。您必须转义反斜杠。:D
awk -F'[{\\\\]' '{print $2}'
对于此特定问题,您只需使用两个sub()
,它可能更易于阅读:
awk 'sub(/[^{]*{/,"")+sub(/\\.*/,"")'
问题的一部分是您在
-F“[{\\]”
中使用了错误的引号类型。默认情况下,始终使用单引号(”
)和双引号(”
)只有在需要的时候。请参见-如果要进行任何shell编程,了解引用和不引用这两种类型之间的区别是非常重要的。在awk中,您需要\\\\\\\\
而不是\\\\
来转义反斜杠的原因是您指定了一个用作FS的字符串(这只是一种正则表达式,有一些额外的提示)因此,在用作regexp之前,awk必须将字符串转换为regexp。这种转换需要对字符串进行一次解析,该解析使用了一组转义。因此,在将字符串转换为regexp的过程中,字符串\\\\\\
被转换为regexp\\\\
,如果编写regexp文本,则需要使用单个转义/\\/
在不同的上下文中。如果在字符串周围使用了“
而不是”
,那么您将要求shell在awk看到字符串之前也解析该字符串,从而在它成为awk中的regexp之前引入第三轮解析,因此您需要编写“\”
以regexp中的\\\
结束!所以-知道你的引号!如果你有带PCRE的grep选项,你也可以使用grep-oP'{\K.*(?=\\)'