次の内容を含むファイルがあります。
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
私が正しく理解した場合、スクリプトには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のあいまいさとこのサイトのコード形式のため、ここには表示されません。)