Como posso usar uma variável bash como um argumento regex para gsub () e match ()?

1

Eu tenho um script

#! /bin/bash
awk -v pat="$1" '{ if(match($0, pat)) {print $0} }' "$3"
awk -v pat="$1" -v rep="$2" '{gsub(pat, rep); print $0}' "$3"

Eu gostaria de executá-lo como

myscript '\.\.+' ' ' ./inputfile

onde $1 é supostamente uma regex compreensível por awk (GNU awk).

A especificação de pat como uma expressão regex como argumentos para gsub() e match() não funcionará. Eu queria saber como posso fazer isso funcionar? Obrigado.

    
por Tim 13.11.2018 / 15:34

2 respostas

3

Você está fazendo as coisas corretamente, no que diz respeito à passagem de variáveis. Para fazer a expressão funcionar, você precisa dobrar as barras invertidas , pelo menos com o Gawk :

myscript '\.\.+' ' ' ./inputfile

Note que você pode simplificar as partes do AWK:

#!/bin/bash
awk -v pat="$1" 'match($0, pat)' "$3"
awk -v pat="$1" -v rep="$2" '{gsub(pat, rep)} 1' "$3"
    
por 13.11.2018 / 15:50
2

Apenas uma resposta rápida com uma abordagem diferente: script escrito em Awk:

#!/usr/bin/gawk -f
BEGIN { find=ARGV[1]; repl=ARGV[2]; delete ARGV[1]; delete ARGV[2]}
      { print gensub(find,repl,"g",$0) }

e depois o comportamento habitual do filtro Unix:

$ chmod 755 myawkscript

$ ls |myawkscript '\w(.)' '{}'
{y}{w}{s}{r}{p}t

$ myawkscript '(\w+)' '{}' myawkscript 
#!/{usr}/{bin}/{gawk} -{f}
{BEGIN} { {find}={ARGV}[{1}]; {repl}={ARGV}[{2}]; ..... 
      { {print} {gensub}({find},{repl},"{g}",${0}) }
    
por 13.11.2018 / 17:58