Deslocamentos de linha relativos em awk (/ pattern / + 1 ou / pattern / -1)

3

Quando quero imprimir linhas entre dois padrões, excluindo as linhas com esses padrões, posso fazê-lo em ex usando +1 e -1 após o padrão. Isso é incrível. Isso é possível em awk ? No momento, eu pesquisei definindo um is_printing flag.

Isso é ex para obter as definições de coluna de uma criação de tabela 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.',

Este é um comando awk para fazer o mesmo:

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

Acho a versão awk não tão legível. Existe uma expressão idiomática que estou perdendo? Pode o sed fazer algo assim também? (Eu prefiro a sintaxe do awk sobre sed 's.)

    
por janmoesen 18.10.2011 / 09:54

1 resposta

1

Desculpe, mas o awk não pode fazer isso, porque cada linha é passada separadamente pelo script.

Teoricamente, seria possível implementar um + x , transformando uma correspondência de linha após x mais linhas de entrada para true, mas não acho que gostaria para depurar tais scripts; -)

BTW: Embora tudo possa ser colocado na mesma linha, eu votaria em uma nova linha pelo menos para cada par condição / ação, então os scripts são muito mais fáceis de ler e entender.

    
por 18.10.2011 / 11:11