imprime linhas com um número específico de caracteres específicos

0

Eu tenho um texto grande salvando muitos caminhos de arquivos e suas informações

# just for demostration
/a/b/c/d/e
/a/b/c/d
/a/b/c
/a/b
/a
/b/c
/b
/c/d
/c
....

Eu quero mostrar apenas aqueles com um número específico de caracteres específicos, por exemplo,

  1. com apenas um /
  2. com não mais que dois /

para que eu extraia apenas pastas raiz ou apenas para subpastas de primeiro nível.

    
por Lee 11.04.2018 / 19:59

2 respostas

2

Com uma expressão regular estendida:

grep -E '^([^/]*/[^/]*){1,2}$' input

que resulta nestas correspondências:

/a/b
/a
/b/c
/b
/c/d
/c

A sintaxe regex diz:

  • ^ - ancorado ao começo da linha
  • ( ... ) - agrupa os seguintes bits juntos
  • [^/]* - qualquer caractere não-forward-slash, zero ou mais deles
  • / - uma barra invertida
  • [^/]* - qualquer caractere não-forward-slash, zero ou mais deles
  • {1,2} - um ou dois desses grupos
  • $ - ancorado ao final da linha
por 11.04.2018 / 20:13
5

Awk solução:

- com apenas um / :

awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }NF == sep' file

A saída:

/a
/b
/c

- com não mais de dois / :

awk -v sep=2 'BEGIN{ FS=OFS="/"; sep += 1 }NF <= sep' file

A saída:

/a/b
/a
/b/c
/b
/c/d
/c
  • sep - variable; significa contagem do separador do diretório
  • FS e OFS - são separador de campo e separador de campo de saída, respectivamente
  • NF - significa número total de campos

Se você precisar combinar as abordagens acima em um único comando awk :

awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }(sep==2 && NF==sep) || (sep>2 && NF<=sep)' file
    
por 11.04.2018 / 20:13