awk skriv apostrof / enstaka citat

Kan inte ta reda på hur man kan undkomma allt medan jag använder awk.

Jag måste bifoga varje ingång sträng med med enstaka citat, t.ex.

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

Kämpat med att fly " " $0 och allt annat och jag kan bara inte göra det fungerar. Antingen skickas $ 0 till bash direkt eller så händer något annat.

Kommentarer

Svar

Här är några sätt:

  1. använder oktala escape-sekvenser. På ASCII-baserade system där " kodas som byte 39 (oktal 047), skulle det vara:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. skicka citatet som en variabel

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

Kommentarer

  • "\047" har aldrig tappat mig. Wow. Tack.
  • O r spara ditt awk-skript i en fil script.awk för att köra som awk -f script.awk input och sedan kan du bara göra { print "'" $0 "'" } eller { printf "'%s'\n", $0 }. Oförmågan att använda ' s i ett ' -avgränsat skript är ett skalproblem, inte ett problem.
  • Alla räddade oktaler från människan ascii är bra i awk. Till och med \000 för NUL (i GNU / awk men inte mawk) och \042 för " .
  • Jag rekommenderar att du lägger till # 3: undvik citatet på skalnivå: awk '{ print "'\''" $0 "'\''" }' input och # 4 använder dubbla citat på skalnivå: awk "{print \"'\" \$0 \"'\" }" input. Eftersom detta är det accepterade svaret och redan listar flera metoder kan det lika gärna inkludera dessa alternativ.

Svar

I awk-kod sätter du bara apostrofen i dubbla citat. Du kan sammanfoga strängar genom att placera dem bredvid varandra (intill varandra), oavsett hur dessa strängar är konstruerade (bokstavlig, variabel, fältreferens, parentesuttryck, …). åsidosätta ”> { print """ $0 """ }

Om den här awk-koden ingår i ett skalskript och awk-koden är i en bokstav med ett citat, måste du ordna att skicka den enda citat karaktär till awk Använd single-quote-backslash-single-quote-single-quote "\"" för att inkludera ett enda citattecken i en enkelciterat skal bokstavligt.

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

Alternativt kan du uttrycka awk-koden utan att använda ett enda citattecken. Du kan använda en backslash följt av tre oktala siffror för att representera alla tecken i en sträng bokstavligen i awk. För ett enda citat på ASCII-baserade system, att ”s \047.

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

Kommentarer

  • awk '{ print "'\''" $0 "'\''" }' det här är bara galet.
  • @ ArtemS.Tashkinov Det ' är också överlägset den överlägsna lösningen när det gäller bärbarhet, och jag skulle hävda att det är mer förståeligt för någon som känner till skal lika bra som de borde om de ' använder shell än oktala flykt. '\'' är något som alla som gör shell-skript ska internalisera som sättet att undkomma enstaka citat i en enda citerad skalsträng, särskilt för att enstaka citerade strängar är det robusta / bärbara / säkraste sättet att undkomma godtyckliga strängar i alla Bourne-liknande skal, men alternativt kan du sätta awk-koden i en dubbelciterad sträng: awk "{print \"'\" \$0 \"'\" }"

Svar

Obs! t behöver du inte ”div id =” c4d73ca63c ”>

för det.

Du kan istället använda paste: {/ p>

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

Det skulle vara effektivare och ha färre begränsningar än awk -baserat eller sed -baserade lösningar.

Svar

Awk-koden behöver bara vara

{ print """ $0 """ } 

Du kan lägga det i en fil så att du inte behöver citera något:

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

Eller använd en dubbelciterad sträng och undgå citat och dollartecknet:

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

Eller i Bash / ksh / zsh, använd $"..." offertform som gör att du kan undkomma det enskilda citatet inuti:

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

Svar

du kan också använda kommandot sed.

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

eller

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

Kommentarer

  • Eller sed -E "s/.*/'&'/" infile.
  • @chepner ja, jag flyttade det till svaret 🙂

Svar

En sätt att klä strängen i enstaka citat är via printf-kommandot gnu xargs:

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

Perl

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

Använda GNU sed:

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *