![Regex inversa no AWK?](https://rvso.com/image/97228/Regex%20inversa%20no%20AWK%3F.png)
Estou tentando filtrar as linhas que contêm uma palavra específica. O regex é a entrada da linha de comando para o script.
$0 ~ regex {
//Do something.
}
A entrada de amostra é:
**String** **number**
domain 1
domain 2
bla 3
Portanto, a partir da entrada acima, o usuário pode dizer - filtrar as linhas que possuem a palavra "domínio".
O que eu tentei:
regex = "\?\\!domain"
(antecipação negativa).
Mas esse regex está filtrando todas as linhas. Não apenas as linhas com a palavra "domínio".
Responder1
Para determinado arquivo de entrada input
contendo o seguinte:
domain
demesne
Para filtrar linhas contendo domain
:
$ awk '/domain/ { print }' input
domain
Para filtrar linhasnãocontendo domain
:
$ awk '!/domain/ {print }' input
demesne
Para filtragem com base nocampoem vez da linha inteira, podemos tentar o seguinte para o novo input
arquivo fornecido:
example www.example.com
exemplar www.example.net
Para filtrar linhas onde o primeiro campocontém example
:
$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net
Na sua pergunta, você usou $0
qual é a linha inteira em vez do primeiro campo.
Responder2
Outra maneira mais flexível/poderosa de filtrar linhas é com {next}
:
- Para imprimir todas as linhas quenãocorresponder a um dado
regex
, faça:awk '/regex/ {next} {print}' inputfile
Você pode até filtrar todas as linhas entre duas linhas específicas com este método, da seguinte maneira:
Para imprimir todas as linhas quenão sãoentre uma correspondência de linha
regex1
e a primeira correspondência de linha seguinteregex2
, faça:awk '/regex1/,/regex2/ {next} {print}' inputfile
o que não é possível com o
awk '!/regex/'
método (se não me engano).
Por exemplo, se inputfile
o conteúdo do seu for este:
hello, here is my confidential information
SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END
This is the end of my message
Então, este comando awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfile
imprimiria:
hello, here is my confidential information
This is the end of my message
Responder3
echo 'hello, here is my confidential information
SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END
This is the end of my message' |
mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'
gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'
hello, here is my confidential information
This is the end of my message