使用awk检测正则表达式模式并逐行打印?

时间:2013-02-06 00:24:02

标签: linux sed awk

我有一个格式为[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]

的文本文件

我想逐行打印`[ONE。+]`。

示例输出为

[ONE testing 1 2 3]
[ONE 123]

我已经尝试了awk '/\[ONE.+\]/ { print $1 }'但它没有用。任何人都可以教我为什么?什么是正确的方法?

4 个答案:

答案 0 :(得分:0)

awk逐行工作,因此表达式每行只匹配一次。要在awk中执行此操作,可以在循环中使用match函数。你还必须修改你的正则表达式,使其不那么贪婪,因为你的表达式并没有神奇地停在第一个]。

使用grep可能更容易:

echo  "[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]" | grep -o '\[ONE[^]]*\]'

答案 1 :(得分:0)

您可以尝试这样的事情

sed -re 's/(\[ONE[^\[]*\])/\n\1\n/g' temp.txt

输入

[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]

输出

[ONE testing 1 2 3]
 [TWO lorem ipsum] 
[ONE 123]

如果你想用TWO删除列,那么

sed -re 's/(\[ONE[^\[]*\])()/\n\1\n/g; s/(\[[^ONE][^\[]*\])//g' temp.txt

输出

[ONE testing 1 2 3]

[ONE 123]

答案 2 :(得分:0)

如果这是更重要的事情的一部分:

BEGIN { 
# Change the field-separator, from default blank, to the end-marker 
# for each "field"
    FS = "] "
}
# Get rid of lines which can't possibly match
!/\[ONE/ { next
    }
{
# Test and report each of three fields for starting with [ONE,
# "closing" the field with FS, except for the last which will 
# already be "closed"
if ( $1 ~ /^\[ONE/ ) {
    print $1 FS
    }
if ( $2 ~ /^\[ONE/ ) {
    print $2 FS
    }
if ( $3 ~ /^\[ONE/ ) {
    print $3
    }
}

如果您愿意,可以用循环中的一个替换“if”,但要注意最后一个,因为不需要FS(字段分隔符)(除非您的数据中有一个尾随空白)

答案 3 :(得分:0)

默认情况下,“awk”将“单个空格”作为分隔符,“print $ 1”命令尝试检索由默认分隔符分隔的第一个值。

试试这个:

让一个名为'test.txt'的文本文件包含三行。

  
    
      
        

cat test.txt

      
    
  

[ONE testing 1 2 3]

[两个lorem ipsum]

[ONE 123]

  
    
      
        

grep -h'[ONE *'test.txt

      
    
  

[ONE testing 1 2 3]

[ONE 123]