0

我有一个这种格式的文本文件[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]

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

一个示例输出是

[ONE testing 1 2 3]
[ONE 123]

我试过awk '/\[ONE.+\]/ { print $1 }'了,但没有用。谁能教我为什么?正确的方法是什么?

4

4 回答 4

0

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

使用 grep 可能更容易:

echo  "[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]" | grep -o '\[ONE[^]]*\]'
于 2013-02-06T00:32:50.460 回答
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]
于 2013-02-06T01:12:19.720 回答
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(字段分隔符)(除非您的数据中有尾随空白)。

于 2013-02-06T01:16:13.257 回答
0

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

试试这个:

假设有一个名为“test.txt”的文本文件,其中包含三行。

猫测试.txt

[一次测试 1 2 3]

[两个 lorem ipsum]

[一123]

grep -h '[ONE*' test.txt

[一次测试 1 2 3]

[一123]

于 2013-02-07T05:50:50.757 回答