awkの相対行オフセット(/pattern/+1または/pattern/-1)

awkの相対行オフセット(/pattern/+1または/pattern/-1)

2つのパターン間の線(このパターンがある線を除く)を印刷したい場合は、exパターンを使用して印刷できます+1-1ギイ。可能ですかawk?今is_printingフラグを立てて一つにまとめます。

これはex、SQLテーブル生成から列定義を取得することです。

$ ex schema/media.sql <<< '/^CREATE TABLE/+1,/^)/-1p'
#        id
#                SMALLINT
#                UNSIGNED
#                NOT NULL
#                AUTO_INCREMENT
#                COMMENT 'The auto-generated ID.',
#        parent_id
#                SMALLINT
#                UNSIGNED
#                NULL
#                COMMENT 'The ID of the parent album, if any.',
#        title
#                VARCHAR(255)
#                COLLATE utf8_unicode_ci
#                NOT NULL
#                DEFAULT ''
#                COMMENT 'The album title.',
#        description
#                TEXT
#                COLLATE utf8_unicode_ci
#                NOT NULL
#                COMMENT 'The album''s description.',

awk同じ操作を実行するコマンドは次のとおりです。

$ awk '/^\)/ { exit; } is_printing; /^CREATE TABLE/ { is_printing = 1; }' schema/media.sql

awkバージョンは読みにくいです。私は慣用語を見逃していますか?sedこのようなことが可能でしょうか? (私はawks構文よりs構文を好みます。)sed

答え1

申し訳ありません。各行がスクリプトを個別に渡すので、awkではそれを行うことはできません。

理論的には可能です+xそして、一致するように線を回します。Xもっと多くの入力が実際に動作しますが、そのようなスクリプトをデバッグしたくはありません;-)

注:すべてが同じ行にある可能性がありますが、少なくとも各条件/作業ペアについて新しい行に投票することで、スクリプトを読みやすく理解しやすくなります。

関連情報