Delimita pelo espaço mas ignora o espaço da barra invertida

8
5678 []
testing,\ group []
[testing []
ip\ 5.6.7.8 []
launch-wizard-1 0.0.0.0/0
456dlkjfa []
1.2.3.4 []
test 1.2.3.4/32 4.3.2.0/23 4.3.2.0/23
default 4.3.2.0/23 4.3.2.0/23
launch-wizard-2 0.0.0.0/0
launch-wizard-3 0.0.0.0/0
2.3.4.5/32 []

Gostaria de obter a primeira coluna acima, mas o problema é que preciso tratar \ (espaço de barra invertida) como parte da coluna, portanto, awk '{print $1}' deve dá-me

5678
testing,\ group
[testing
ip\ 5.6.7.8
launch-wizard-1
456dlkjfa
1.2.3.4
test
default
launch-wizard-2
launch-wizard-3
2.3.4.5/32
    
por GypsyCosmonaut 25.09.2018 / 17:00

4 respostas

9

com o gnu awk ( gawk ) você pode usar algumas assertivas de comprimento zero como \< ou \> :

$ echo 'a\ b c' | gawk 'BEGIN{FS="\> +"} {print $1}'
a\ b

mas, infelizmente, não os totalmente desenvolvidos de perl ou pcre (por exemplo, (?<!\) , (?<=\w) , etc):

$ echo 'a\ b, c' | perl -nle '@a=split /(?<!\)\s+/, $_; print $a[0]'
a\ b,
    
por 25.09.2018 / 18:55
5

Você pode substituir \ space por outra coisa e voltar depois.

sed 's/\ /\x20/g' data_file | awk '{ print $1; }' | sed 's/\x20/\ /g'
    
por 25.09.2018 / 17:20
5

Com o GNU grep ou compatível:

grep -Po '^(\.|\S)*'

Ou com o ERE:

grep -Eo '^(\.|[^\[:space:]])*'

Isso trata \ como um operador de cotação, para espaços em branco como um delimitador, mas também para si mesmo. Ou seja, em foo\ bar input, ele retorna foo\ .

    
por 26.09.2018 / 00:03
4

Com apenas sed :

sed -r 's/^((([^\]*\ ){1,})?[^ ]*).*//' infile

Ou mais curto:

sed -r 's/^(([^\]*\ )*[^ ]*).*//' infile

Este (([^\]*\ ){1,})?[^ ]* corresponde:

  • [^\]*\ : qualquer coisa que não seja uma barra invertida que termine com uma barra invertida seguida por um espaço (observe que \ dentro da classe de caractere não precisa ter escape, mas o lado externo faz).
  • ([^\]*\ ){1,} : correspondência acima com um ou mais tempos de ocorrências.
  • (([^\]*\ ){1,})? : isso é opcional ao usar (...)? ; poderíamos usar ([^\]*\ ){0,} em vez disso ou ([^\]*\ )* .
  • ((([^\]*\ ){1,})?[^ ]*) : corresponde acima do que é opcional seguido por qualquer coisa que não seja um espaço e mantenha como grupo corresponder com como referência de volta.
  • ((([^\]*\ ){1,})?[^ ]*).* : correspondências acima de (...) e qualquer outra coisa .* .

então é a peça de reposição, basta imprimir o que é a saída:

5678
testing,\ group
[testing
ip\ 5.6.7.8
launch-wizard-1
456dlkjfa
1.2.3.4
test
default
launch-wizard-2
launch-wizard-3
2.3.4.5/32
    
por 25.09.2018 / 17:53