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 eu preciso tratar \
(espaço de barra invertida) como parte da coluna, portanto, awk '{print $1}'
deve me fornecer
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
text-processing
awk
sed
CiganoCosmonauta
fonte
fonte
\
especial? Por exemplo, éa\\ b
um campo ou dois?[[:space:]]
por\[[:space:]]
, os dados originais foram \ intocados em seu lugar. Depois de obter os dados originais na primeira coluna delimitados apenas por espaços e não\[[:space:]]
, eu seria substituído\[[:space:]]
por[[:space:]]
e ficaria com os dados originais novamente com \.Respostas:
Com o gnu awk (
gawk
), você pode usar algumas afirmações de comprimento zero como\<
ou\>
:mas, infelizmente, não os cheios-soprado a partir
perl
oupcre
(por ex.(?<!\\)
,(?<=\w)
, etc):fonte
Você pode substituir \ space por outra coisa e voltar novamente depois.
fonte
\034
:awk '{gsub(/\\ /,SUBSEP,$0); val=$1; gsub(SUBSEP,"\\ ",val); print val}' file
Com GNU
grep
ou compatível:Ou com ERE:
Isso trata
\
como um operador de citação, para o espaço em branco como um delimitador, mas também para si mesmo. Ou seja, nafoo\\ bar
entrada, ele retornafoo\\
.fonte
Com apenas
sed
:Ou mais curto:
Isso
(([^\]*\\ ){1,})?[^ ]*
corresponde:[^\]*\\
: qualquer coisa que não seja uma barra invertida que termine com barra invertida seguida por um espaço (observe que\
não é necessário que a classe de personagem interna escape, mas a fora).([^\]*\\ ){1,}
: correspondendo acima com um ou mais tempos de ocorrências.(([^\]*\\ ){1,})?
: isso é opcional ao usar(...)?
; nós poderíamos usar([^\]*\\ ){0,}
também ou([^\]*\\ )*
.((([^\]*\\ ){1,})?[^ ]*)
: corresponde acima do que é opcional, seguido por qualquer coisa que não seja um espaço e mantenha como correspondência de grupo a\1
referência anterior.((([^\]*\\ ){1,})?[^ ]*).*
: corresponde acima(...)
e qualquer outra coisa.*
.então é peça de reposição apenas imprima
\1
qual é a saída:fonte