2012-03-27 23 views
68

Chcę wykonać następująceJak uciec pojedynczy cytat wewnątrz awk

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

Ale ucieczki pojedynczy cudzysłów w ten sposób nie działa

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

Jak to zrobić? Dzięki za pomoc.

+0

Wiele języków unika cytatów, umieszczając dwa z nich w rzędzie, być może spróbuj. – joshuahealy

+0

Próbowałem awk "BEGIN {FS =" ";} {printf" "% s" ", 1 $} ', ale nie wydrukowano żadnego pojedynczego cudzysłowu. –

+0

[Ta strona] (http://www.gnu.org/software/gawk/manual/html_node/Quoting.html) mówi, że uwzględnienie pojedynczego cudzysłowu w ciągu jedno cudzysłowów jest niemożliwe. Może będziesz musiał zamienić się na podwójne cytaty. – joshuahealy

Odpowiedz

101

to może to, czego szukasz:

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

czyli z '\'' zamknąć otwór ', a następnie wydrukować dosłownego ' od niej ucieczki i wreszcie ponownie otworzyć '.

+1

dziwnie, działa. :) –

+34

Nie ma nic wspólnego z awk. Znak '' 'zamyka literał napisu 'opening' 'powłoki. Literał powłoki nie obsługuje ucieczki odwrotnej do tego. Sekwencja '' '' '' 'lewy: zamyka literowy cudzysłów, określa znak cudzysłowu (używając znaku, który * jest * obsługiwany poza literałami z pojedynczym cudzysłowem), a następnie ponownie otwiera nowy pojedynczy cudzysłów dosłowny. Można go traktować jako czteroznakową sekwencję ucieczkową, aby uzyskać pojedynczy cytat. :) – Kaz

+2

@Steve: Wielkie dzięki za bardzo przydatną odpowiedź. Uratowałeś mi wiele bólów głowy! –

51

Jeden cytat reprezentowane przy użyciu \x27

Podobnie jak w

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

Source

+9

+1, ale trzeba dodać: '\ x27' jest rozszerzeniem; Awaria POSIX Awk rozpoznaje tylko '\ 047'. ('\ 47' też jest w porządku, jeśli nie następuje cyfra ósemkowa.) – hemflit

+1

Jak kończysz \ x27, jeśli masz inny numer po nim? –

+1

Jason, łączysz dwa ciągi literałów: "AAA \ x27" "1". Lub po prostu użyj ósemkowego. – hemflit

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

Inną możliwością jest przenoszenie apostrof jako zmienna awk:

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

Prostsze przykład:

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

Jest to jasne i zwięzłe, zwłaszcza jeśli chcesz użyć wielu cytatów. –

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

To: '"'"' w cudzysłowach.

+1

Zwyczajowo komentuje się podczas głosowania w dół lub ryzykuje się, że zostanie nazwany kurczakiem. –

Powiązane problemy