我有一个包含以下内容的文件:
select *
from
emp;
select *
from
dept;
selection
end;
我想获得这个输出:
select *
from
emp;
select *
from
dept;
我尝试使用
awk '/SELECT/{a=1} a; /;/{a=0}' XXARXADLMT.txt
但这没有用。
答案1
即使您的文件比您插入的文件长,这也会起作用:
while read line; do
if [[ "$line" == "select *" ]]; then
echo "$line"
read line
echo "$line"
read line
echo "$line"
fi
done < XXARXADLMT.txt
或者您可以将重复替换read line; echo $line;
为:
for i in {1..2}; do read line; echo $line; done
答案2
如果我理解正确的话,您的脚本中有两个问题:
- 区分大小写,
- 较长单词的匹配部分。
此外,您可以使用逗号运算符来代替设置变量。
结论是,以下内容应该满足您的要求:
awk -v IGNORECASE=1 '/select /,/;/' XXARXADLMT.txt
答案3
perl -00 -n -e 'print if (m/select /i)' XXARXADLMT.txt
这使用 的perl
段落读取模式(选项)仅打印与不区分大小写的正则表达式(带有尾随空格)-00
匹配的段落。select
“段落”是由 1 个或多个空行分隔的文本块。
输出:
select *
from
emp;
select *
from
dept;
(输出末尾还有另一个空行,但是由于 html 的变化无常和此站点的代码格式,它不会在此处显示)。