Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/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 如何在特殊字符{和\之间找到模式?_Regex_Awk_Sed - Fatal编程技术网

Regex 如何在特殊字符{和\之间找到模式?

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

我一直在学习如何通过zLinux控制台使用z/VM。我已经向z/VM客户发送了一个CMS命令,并将输出返回到zLinux上的一个文件。现在剩下的就是清理文件并通过模式提取正确的日期

我注意到该文件包含{和a\之间的正确数据。该模式以{开头,以a结尾。请参见下面的示例

示例:

 &{HELLO WORLD TEST 123 \INMR06
有很多这样的行,我尝试使用以下命令提取模式:

  • awk-F“[{\]”“{print$2}”TMPCMS

    结果:你好世界测试123\INMR06

  • awk-F“[{\\]”“{print$2}”TMPCMS

    结果:awk:警告:转义序列被视为普通

               *HELLO WORLD TEST 123 \INMR06*
    
  • 我只想得到{和\之间的字符串“helloworldtest123”,而忽略“\INRM06”

    我只是似乎无法逃避那个“\”

    真的

    乔伊276


    OP的代码修复:很好的尝试,你很接近了。如果你在字段分隔符中正确转义
    \
    字符,你就可以完成。用GNU
    awk
    中显示的示例编写和测试

    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.*(?=\\)'