awk nyomtatási aposztróf / egyetlen idézet

Nem tudom kitalálni, hogyan kerüljünk el mindent az awk használata közben.

Minden egyes bemenetet mellékelnem kell karaktersorozat egyetlen idézőjelekkel, pl.

input string1 string2 string3 output "string1" "string2" "string3" 

Harcolt a szökéssel " " $0 és minden mással, és egyszerűen nem tudok vagy működik. Vagy $ 0-t adnak át közvetlenül a bash-nak, vagy valami más történik.

Megjegyzések

Válasz

Íme néhány módszer:

  1. használjon oktális menekülési szekvenciákat. Azokban az ASCII-alapú rendszerekben, ahol a " 39-es bájtként van kódolva (047. oktális), ez a következő lenne:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. adja át az idézetet változóként

     $ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3" 

Megjegyzések

  • "\047" soha nem fordult meg a fejemben. Ejha. >
  • O r mentsd el az awk parancsfájlt egy script.awk fájlba, hogy awk -f script.awk input néven hajtsd végre, és akkor egyszerűen megteheted / div> vagy { printf "'%s'\n", $0 }. A ' s használatának képtelensége egy ' -határolt szkriptben nem shell, hanem awk probléma.
  • A man ascii elől minden szökött oktál jó az awk-ban. Még \000 NUL esetén (GNU / awk-ban, de nem mawk) és \042 esetén " .
  • Javaslom a # 3 hozzáadását: az idézet elkerülése a shell szintjén: awk '{ print "'\''" $0 "'\''" }' input és a # 4 kettős idézőjeleket használjon a shell szintjén: awk "{print \"'\" \$0 \"'\" }" input. Mivel ez az elfogadott válasz, és már több módszert is felsorol, az is tartalmazhatja ezeket az alternatívákat.

Válasz

Az awk kódban csak írja be az aposztrófot dupla idézőjelek közé. A sztringeket összefűzheti úgy, hogy egymás mellé helyezi őket (egymás mellé helyezése), függetlenül attól, hogy ezek a karaktersorok hogyan épülnek fel (szó szerinti, változó, mező hivatkozás, zárójeles kifejezés, stb.).

 { print """ $0 """ }  

Ha ezt az awk kódot egy shell szkript tartalmazza, és az awk kód egy idézőjelű literálban van, akkor gondoskodnia kell az átadásról az egyetlen idézet karakter az awk-ra. Használjon egy-idézet-visszavonás-egyetlen-idézet-egyetlen-idézet "\"" elemet egyetlen idézet karakter beillesztéséhez egy egyetlen idézőjelű shell literal.

 awk "{ print ""\""" $0 ""\""" }"  

Alternatív megoldásként kifejezheti az awk kódot anélkül, hogy egyetlen idézet karakter. Használhat visszavonást, amelyet három oktális számjegy követ, az awk karakterlánc bármely karakterének ábrázolására. Az ASCII alapú rendszerek egyetlen árajánlatához “s \047.

 awk "{ print "\047" $0 "\047" }"  

Megjegyzések

  • awk '{ print "'\''" $0 "'\''" }' ez csak őrült.
  • @ ArtemS.Tashkinov Ez ' is messze a legjobb megoldás, ha a hordozhatóságról van szó, és azt állítom, érthetőbb annak, aki olyan jól ismeri a shell-t, mint ha kellene ' héjat használnak, mint az oktális menekülés. egyetlen idézett héj karakterlánc, különösen azért, mert az egyetlen idézett karakterláncok a robusztus / hordozható / legbiztonságosabb módja az önkényes karakterláncok elkerülésének az összes Bourne-szerű héjban. De alternatív megoldásként az awk kódot kettős idézett karakterláncba is be lehet tenni: awk "{print \"'\" \$0 \"'\" }"

Válasz

Megjegyzés: tha t ehhez nem kell awk.

Helyette használhatja a paste alapeszközöket:

 < input paste -d """ /dev/null - /dev/null 

Hatékonyabb és kevesebb korlátozás lenne, mint a awk alapú vagy sed alapú megoldások.

Válasz

Az awk kódnak csak a következőnek kell lennie:

{ print """ $0 """ } 

Ezt beteheti egy fájlba, így nem kell semmit idéznie:

$ printf "a\nb\n" | awk -f quote.awk "a" "b" 

Vagy használja dupla idézőjelű karakterlánc, és kerülje az idézőjeleket és a dollárjelet:

$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }" 

Vagy a Bash / ksh / zsh fájlban használja a $"..." idézőjelek, amelyek lehetővé teszik, hogy elkerülje a benne lévő egyetlen idézetet:

$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }" 

Válasz

használhatja az sed parancsot is.

<infile sed -E "s/^|$/"/g" 

vagy

<infile sed -E "s/.*/"&"/" 

Megjegyzések

  • Vagy sed -E "s/.*/'&'/" infile.
  • @chepner igen, ezt áthelyeztem a válaszba:)

Válasz

Egy A karakterlánc egyetlen idézőjelbe foglalása a printf gnu xargs paranccsal lehetséges:

< file xargs -d"\n" printf ""%s"\n" 

Perl

perl -sple "$_="$q$_$q"" -- -q=\" file 

A GNU sed használata:

sed -e "G;H;z;x;y/\n/"/" file 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük