我有一个格式为[ONE testing 1 2 3] [TWO lorem ipsum] [ONE 123]
我想逐行打印`[ONE。+]`。
示例输出为
[ONE testing 1 2 3]
[ONE 123]
我已经尝试了awk '/\[ONE.+\]/ { print $1 }'
但它没有用。任何人都可以教我为什么?什么是正确的方法?
答案 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]