我有一个这种格式的文本文件[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]
我想逐行打印`[ONE.+]`。
一个示例输出是
[ONE testing 1 2 3]
[ONE 123]
我试过awk '/\[ONE.+\]/ { print $1 }'
了,但没有用。谁能教我为什么?正确的方法是什么?
awk 逐行工作,因此表达式每行只匹配一次。要在 awk 中执行此操作,您可以match
在循环中使用该函数。您还必须修改您的正则表达式以减少贪婪,因为您的表达式不会神奇地停在第一个]。
使用 grep 可能更容易:
echo "[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]" | grep -o '\[ONE[^]]*\]'
你可以试试这样的
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]
如果这是更大的一部分:
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(字段分隔符)(除非您的数据中有尾随空白)。
默认情况下,“awk”将“单个空格”作为分隔符,“print $1”命令尝试检索由默认分隔符分隔的第一个值。
试试这个:
假设有一个名为“test.txt”的文本文件,其中包含三行。
猫测试.txt
[一次测试 1 2 3]
[两个 lorem ipsum]
[一123]
grep -h '[ONE*' test.txt
[一次测试 1 2 3]
[一123]