Várias opções aqui:
-
pat1, pat2 tratado como regexps:
pat1="A sentence here" pat2='\*{58}' export pat1 pat2 awk '$0 ~ ENVIRON["pat1"], $0 ~ ENVIRON["pat2"]'
Observe que
mawk
e versões degawk
anteriores a 4.0.0 não suportam o operador de expressão regular estendida{}
. Para versões antigas degawk
, você pode passar a variável de ambientePOSIXLY_CORRECT
para reconhecê-la.Aqui, use a abordagem
start-condition, end-condition [{action}]
, mas você pode fazer o mesmo com a abordagemp
flag. -
pat1, pat2 tratado como sequências fixas:
pat1="A sentence here" pat2=$(printf '*%.0s' {1..58}) export pat1 pat2 awk 'index($0, ENVIRON["pat1"]), index($0, ENVIRON["pat2"])'
Aqui,
index()
procura a agulha (o conteúdo da variável) em qualquer lugar do palheiro (o registro atual (linha)), mas você também pode fazer comparação simples de linha completa:awk '"" $0 == ENVIRON["pat1"], "" $0 == ENVIRON["pat2"]'
(o
""
deve forçar uma comparação de string mesmo nos casos em que ambos$0
eENVIRON["patx"]
sejam numéricos).
Evite usar -v
para passar dados que possam conter caracteres de barra invertida, pois awk
faz alguma sequência de escape C ( \n
, \b
, \
...) processando neles, então é necessário escapar das barras invertidas. O mesmo vale para variáveis passadas como awk '...code...' awkvar="$shellvar"
. Use ENVIRON
ou ARGV
.
Veja esta resposta a uma questão relacionada para mais detalhes.