Extrai tudo antes da string correspondente

1

Eu tenho uma string

hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/

e o que eu quero é apenas

hdfs://ussbssn01.us.xyz.com//

Eu tentei o awk, sed, mas não obtive o que estava esperando porque a string de correspondência // estava se repetindo. Existe uma maneira de obter o resultado desejado?

    
por Alex Raj Kaliamoorthy 18.08.2016 / 08:40

3 respostas

2

Para obter as duas primeiras strings com as strings correspondentes:

$ s=hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/
$ echo "$s" | awk -F// '{print $1 FS $2 FS}'
hdfs://ussbssn01.us.xyz.com//

Como funciona:

  • -F//

    Isso diz ao awk para usar // como o separador de campo.

  • print $1 FS $2 FS

    Isto diz ao awk para imprimir o primeiro campo, um separador de campos, o segundo campo e outro separador de campos.

Alternativa

Para obter tudo até e incluindo as últimas sequências de correspondência:

$ echo "$s" | awk -F// '{$NF=""} 1' OFS=//
hdfs://ussbssn01.us.xyz.com//

Como funciona:

  • -F//

    Isso diz ao awk para usar // como o separador de campo para entrada .

  • $NF=""

    Isto diz ao awk para substituir o último campo pela string vazia.

  • 1

    Esta é uma abreviada enigmática do awk para imprimir o registro.

  • OFS=//

    Isto diz ao awk para usar // como o separador de campos para output .

por 18.08.2016 / 08:48
1

com grep

$ grep -o '^.*//.*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//

$ grep -oP '^.*?//.*?//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//

$ grep -oP '^.*?com//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//
  • O primeiro funciona se houver apenas dois conjuntos de //
  • O segundo extrai até o segundo conjunto de //
  • O terceiro funciona se a string obrigatória terminar com com//

Editar:

Como aponta @ilkkachu, [^/]* (zero ou mais caracteres, além de / ) pode ser usado em vez de .*? no segundo caso. Exemplo:

$ grep -o '^[^/]*//[^/]*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa//"
hdfs://ussbssn01.us.xyz.com//
    
por 18.08.2016 / 09:04
0

Se você tiver a string em uma variável do shell, var , em ksh ou bash :

$ var="hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
$ printf "%s\n" "${var%//*}"
hdfs://ussbssn01.us.xyz.com

A substituição da variável ${var%suffix} reduzirá em suffix o valor de var .

    
por 18.08.2016 / 10:27