Delimita dallo spazio ma ignora lo spazio di barra rovesciata


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 []

Vorrei ottenere la prima colonna di quanto sopra, ma il trucco è che, devo trattare \ (spazio barra rovesciata) come parte della colonna, quindi awk '{print $1}'dovrei darmi

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

\ Essere trattato come un personaggio di escape è sempre o è solo \ speciale? Ad esempio, a\\ buno o due campi?
Gregory Nisbet,

@GregoryNisbet che ho inserito \ è per il carattere di escape, non per i dati reali
GypsyCosmonaut

1
Se i tuoi dati contenessero una vera barra rovesciata, come verrebbero rappresentati?
Gregory Nisbet,

@GregoryNisbet Buona domanda. Poiché ho sostituito solo [[:space:]]con \[[:space:]], i dati originali sono rimasti intatti al loro posto. Dopo aver ottenuto i dati originali nella prima colonna delimitati solo da spazi e non \[[:space:]], rimpiazzerei \[[:space:]]con [[:space:]]e verrei nuovamente con i dati originali che ha \.
GypsyCosmonaut il

Risposte:


9

con gnu awk ( gawk) puoi usare alcune asserzioni di lunghezza zero come \<o \>:

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

ma purtroppo non quelli in piena regola da perlo pcre(ad es. (?<!\\), (?<=\w)ecc):

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

5

È possibile sostituire \ spazio con qualcos'altro e poi di nuovo indietro.

sed 's/\\ /\\x20/g' data_file | awk '{ print $1; }' | sed 's/\\x20/\\ /g'

Solo con sed: sed 's / \\ / \\ x20 / g; s /. * //; s / \\ x20 / \\ / g' data_file
ctac_

Oppure, awk, usando il valore variabile SUBSEP predefinito di \034:awk '{gsub(/\\ /,SUBSEP,$0); val=$1; gsub(SUBSEP,"\\ ",val); print val}' file
glenn jackman,

5

Con GNU grepo compatibile:

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

O con ERE:

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

Che tratta \come un operatore di quotazione, per gli spazi bianchi come delimitatore, ma anche per se stesso. Cioè, in foo\\ barinput, ritorna foo\\.


4

Con solo sed:

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

O più breve:

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

Questo (([^\]*\\ ){1,})?[^ ]*corrisponde:

  • [^\]*\\: qualsiasi cosa che non sia una barra rovesciata che termina con una barra rovesciata seguita da uno spazio (si noti che \non è necessario che la classe di caratteri interna debba essere salvata, ma all'esterno lo fa).
  • ([^\]*\\ ){1,}: corrispondenza sopra con una o più volte di occorrenze.
  • (([^\]*\\ ){1,})?: questo è facoltativo durante l'utilizzo (...)?; potremmo usare ([^\]*\\ ){0,}anche o ([^\]*\\ )*.
  • ((([^\]*\\ ){1,})?[^ ]*): corrispondenze sopra le quali è facoltativa seguita da tutto ciò che non è uno spazio e mantieni come corrispondenza di gruppo con \1come riferimento indietro.
  • ((([^\]*\\ ){1,})?[^ ]*).*: corrispondenze sopra (...)e qualsiasi altra cosa .*.

quindi la parte di ricambio stampa solo \1quale è l'output:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.