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 []
Eu gostaria de obter a primeira coluna acima, mas o problema é que eu preciso tratar \
(espaço de barra invertida) como parte da coluna, então awk '{print $1}'
deve me dar
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
com gnu awk(
gawk
) você pode usar algumas asserções de comprimento zero como\<
ou\>
:mas infelizmente não os completos de
perl
oupcre
(por exemplo.(?<!\\)
,(?<=\w)
, etc):Você pode substituir \space por outra coisa e voltar depois.
Com GNU
grep
ou compatível:Ou com ERE:
Que trata
\
como um operador de citação, para espaço em branco como delimitador, mas também para si mesmo. Ou seja, nafoo\\ bar
entrada, ele retornafoo\\
.Com apenas
sed
:Ou mais curto:
Isso
(([^\]*\\ ){1,})?[^ ]*
corresponde:[^\]*\\
: qualquer coisa que não seja uma barra invertida que termine com barra invertida seguida de um espaço (observe que\
dentro da classe de caractere não é necessário escapar, mas fora).([^\]*\\ ){1,}
: combinando acima com uma ou mais vezes de ocorrências.(([^\]*\\ ){1,})?
: isso é opcional ao usar(...)?
; poderíamos usar([^\]*\\ ){0,}
em vez disso também ou([^\]*\\ )*
.((([^\]*\\ ){1,})?[^ ]*)
: corresponde acima do qual é opcional seguido por qualquer coisa que não seja um espaço e mantenha como correspondência de grupo com\1
sua referência inversa.((([^\]*\\ ){1,})?[^ ]*).*
: corresponde acima(...)
e qualquer outra coisa.*
.então é a peça de substituição apenas imprima o
\1
que é a saída: