Awk 需要在第一次出现的模式中提取文本

Awk 需要在第一次出现的模式中提取文本,awk,grep,Awk,Grep,我有一个文件,它由以下几行组成: part1 { CORE_LK0 } -group { LK0_GROUP } -module { 20rx } Ignore no3 { CORE_ft0 } -sync { n7 } 我需要在第一次出现{}时提取文本。 我试过这个: grep "{.*}" file.txt 我的输出: part1 { CORE_LK0 } -group { LK0_GROUP } -module { 20rx } Ignore no3 { CORE_ft0

我有一个文件,它由以下几行组成:

 part1 { CORE_LK0 }  -group { LK0_GROUP } -module { 20rx }
 Ignore no3  { CORE_ft0 } -sync { n7 }
我需要在第一次出现{}时提取文本。 我试过这个:

grep "{.*}" file.txt
我的输出:

part1 { CORE_LK0 }  -group { LK0_GROUP } -module { 20rx }
Ignore no3  { CORE_ft0 } -sync { n7 }
但是所需的输出只需要grep第一次出现的{}:

CORE_LK0
CORE_ft0

有人能帮我吗。

您可以使用
sed
来实现此目的:

sed -n 's/^[^{}]*{ *\([[:alnum:]_]*\) *}.*/\1/p' file > results
或者,如果在第一组花括号之间可以有除
{
}
以外的任何字符

sed -n 's/^[^{}]*{ *\([^{}]*\) *}.*/\1/p' file > results

详细信息

  • -n
    -抑制默认行输出(不匹配的行不会被打印)
  • s/
    -替换命令
  • ^[^{}]*{*\([[:alnum:][u]*\)*}.*.
    -匹配
    • ^
      -字符串的开头
    • [^{}]*
      -0个或多个字符,而不是
      {
      }
    • {*
      -
      {
      和0个或更多空格
    • \([[:alnum:]*\)
      -捕获组1:任何0个或更多字母、数字或
    • *}
      -0或更多空格和
      }
    • *
      -行的其余部分
  • \1
    -将整行替换为第1组的内容
  • p
    -打印组1中的值

您可以为此使用
sed

sed -n 's/^[^{}]*{ *\([[:alnum:]_]*\) *}.*/\1/p' file > results
或者,如果在第一组花括号之间可以有除
{
}
以外的任何字符

sed -n 's/^[^{}]*{ *\([^{}]*\) *}.*/\1/p' file > results

详细信息

  • -n
    -抑制默认行输出(不匹配的行不会被打印)
  • s/
    -替换命令
  • ^[^{}]*{*\([[:alnum:][u]*\)*}.*.
    -匹配
    • ^
      -字符串的开头
    • [^{}]*
      -0个或多个字符,而不是
      {
      }
    • {*
      -
      {
      和0个或更多空格
    • \([[:alnum:]*\)
      -捕获组1:任何0个或更多字母、数字或
    • *}
      -0或更多空格和
      }
    • *
      -行的其余部分
  • \1
    -将整行替换为第1组的内容
  • p
    -打印组1中的值

    • 请您尝试以下内容

      awk 'match($0,/{ [^}]*/){print substr($0,RSTART+2,RLENGTH-2)}'  Input_file
      
      说明:



      第二种解决方案:只是为了好玩,建议只使用上述解决方案(使用GNU
      grep编写,仅使用显示的样本进行测试)


      你能试试下面的吗

      awk 'match($0,/{ [^}]*/){print substr($0,RSTART+2,RLENGTH-2)}'  Input_file
      
      说明:



      第二种解决方案:只是为了好玩,建议只使用上述解决方案(使用GNU
      grep编写,仅使用显示的样本进行测试)


      您可以使用Perl实现这一点:

      $ perl -lnE 'say $1 if /^[^{]*\{([^}]*)\}/' file
       CORE_LK0 
       CORE_ft0 
      
      正则表达式解释:

      /^[^{]*\{([^}]*)\}/
      
      
       ^                    start of line anchor
        ^  ^                character class
         ^                  negated -- any character OTHER THAN {
            ^               * is 0 or more of that character class
             ^              \{ is a literal {
               ^    ^       (    ) capture group to define $1 
                 ^ ^        0 or more characters OTHER THAN }
                       ^    literal }      
      

      您可以使用Perl实现这一点:

      $ perl -lnE 'say $1 if /^[^{]*\{([^}]*)\}/' file
       CORE_LK0 
       CORE_ft0 
      
      正则表达式解释:

      /^[^{]*\{([^}]*)\}/
      
      
       ^                    start of line anchor
        ^  ^                character class
         ^                  negated -- any character OTHER THAN {
            ^               * is 0 or more of that character class
             ^              \{ is a literal {
               ^    ^       (    ) capture group to define $1 
                 ^ ^        0 or more characters OTHER THAN }
                       ^    literal }      
      

      试试sed-n的/^[^{}]*{\([^{}]*\}.*/\1/p'file.txt
      Thaks@Wiktor Stribizew。它起作用了。但是我没有正确理解上面的命令。我已经在下面进行了解释。请尝试
      sed-n的/^[^{}]*{\([^{}]*\)}.*/\1/p'file.txt
      Thaks@Wiktor Stribizew。它起作用了。但是我没有正确理解上面的命令。我已经在下面解释了。