2012-03-27 10 views
68

voglio fare quanto segueCome per sfuggire a una sola offerta all'interno awk

awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}' 

Ma sfuggire sola offerta in questo modo non funziona

awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}' 

Come fare questo? Grazie per l'aiuto.

+0

Un numero di lingue sfugge alle citazioni mettendo due di esse in fila, forse provateci. – joshuahealy

+0

Ho provato awk 'BEGIN {FS = "";} {printf "' '% s' '", $ 1}', ma non è stata stampata nessuna virgoletta. –

+0

[Questa pagina] (http://www.gnu.org/software/gawk/manual/html_node/Quoting.html) afferma che includere una virgoletta singola in una stringa con quotatura singola è impossibile. Forse dovrai convertire in virgolette. – joshuahealy

risposta

101

Questo forse quello che stai cercando:

awk 'BEGIN {FS=" ";} {printf "'\''%s'\'' ", $1}' 

cioè con '\'' si chiude l'apertura ', quindi stampare un letterale ' da scampo e, infine, aprire il ' di nuovo.

+1

stranamente, funziona. :) –

+34

Non ha nulla a che fare con awk. Il carattere '' 'chiude la stringa di shell letterale di apertura' '. Il letterale della shell non supporta una escape backslash per questo. La sequenza ''\' '' fa il trucco: chiude il letterale a virgoletta singola, specifica il carattere di virgoletta (usando una fuga che * è * supportata al di fuori dei valori letterali a quota singola) e quindi riapre una nuova virgoletta singola letterale. Puoi pensare ad una sequenza di escape di quattro caratteri per ottenere una singola citazione. :) – Kaz

+2

@Steve: Grazie mille per la tua risposta molto utile. Mi hai risparmiato un sacco di mal di testa! –

51

Una sola citazione è rappresentato utilizzando \x27

Come in

awk 'BEGIN {FS=" ";} {printf "\x27%s\x27 ", $1}' 

Source

+9

+1, ma è necessario aggiungere: '\ x27' è un'estensione; POSIX Awk riconosce solo '\ 047'. ('\ 47' va bene anche se non è seguito da una cifra ottale.) – hemflit

+1

Come finisci \ x27 se hai un altro numero dopo di esso? –

+1

Jason, si concatenano due valori letterali stringa: "AAA \ x27" "1". O semplicemente usi l'ottale. – hemflit

7
awk 'BEGIN {FS=" "} {printf "\047%s\047 ", $1}' 
19

Un'altra opzione è quella di passare il singolo citazione come variabile awk:

awk -v q=\' 'BEGIN {FS=" ";} {printf "%s%s%s ", q, $1, q}' 

Più semplice esempio:

# Prints 'test me', _including_ the single quotes. 
awk -v q=\' '{print q $0 q }' <<<'test me' 
+3

Questo è chiaro e conciso, soprattutto se è necessario utilizzare molte virgolette. –

-1
$ cat > test.in 
foo 
bar 
$ awk 'BEGIN {FS=" ";} {printf "'"'"'%s'"'"' ", $1}' test.in 
'foo' 'bar' 

Ecco: '"'"' tra virgolette.

+1

È consuetudine commentare quando si vota verso il basso - o rischia di essere chiamato pollo. –

Problemi correlati