awk print apostrop / single quote

Nelze přijít na to, jak uniknout všemu při použití awk.

Musím přiložit každý vstup řetězec s jednoduchými uvozovkami, např.

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

Bojoval jsem s únikem " " $0 a se vším jiným a prostě nemůžu dělat funguje to. Buď je $ 0 předáno přímo do bash, nebo se stane něco jiného.

Komentáře

Odpověď

Tady je několik způsobů:

  1. použít osmičkové únikové sekvence. V systémech založených na ASCII, kde je " kódován jako bajt 39 (osmičkový 047), by to bylo:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. předat nabídku jako proměnnou

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

Komentáře

  • "\047" mi nikdy nenapadlo. Páni. Děkuji.
  • O. r uložte svůj awk skript do souboru script.awk, který chcete spustit jako awk -f script.awk input a pak stačí udělat { print "'" $0 "'" } nebo { printf "'%s'\n", $0 }. Neschopnost použít ' s ve ' oddělovacím skriptu je problém shellu, nikoli problém awk.
  • Jakýkoli uniklý osmičkový soubor z man ascii je v awk dobrý. Dokonce \000 pro NUL (v GNU / awk, ale ne mawk) a \042 pro " .
  • Doporučuji přidat # 3: uniknout z nabídky na úrovni prostředí: awk '{ print "'\''" $0 "'\''" }' input a # 4 použít uvozovky na úrovni prostředí: awk "{print \"'\" \$0 \"'\" }" input. Jelikož se jedná o přijímanou odpověď a již obsahuje několik metod, může také zahrnovat tyto alternativy.

Odpovědět

V awk kódu vložte apostrof do uvozovek. Řetězce můžete zřetězit tak, že je umístíte vedle sebe (juxtaposition), bez ohledu na to, jak jsou tyto řetězce konstruovány (doslovný, proměnný, odkaz na pole, výraz v závorkách, …).

 { print """ $0 """ }  

Pokud je tento awk kód obsažen v shellovém skriptu a awk kód je v literále s jednou uvozovkou, musíte si předat znak jednoduché uvozovky awk. Použijte single-quote-backslash-single-quote-single-quote "\"" k zahrnutí jednoho znaku uvozovky do single-quotes shell literal.

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

Případně vyjádřit awk kód bez použití znak jedné uvozovky. Zpětné lomítko následované třemi osmičkovými číslicemi můžete použít k reprezentaci libovolného znaku v řetězcovém literálu v awk. Jediný citát na systémech založených na ASCII: „\047.

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

Komentáře

  • awk '{ print "'\''" $0 "'\''" }' to je prostě šílené.
  • @ ArtemS.Tashkinov Je to ' také zdaleka vynikající řešení, pokud jde o přenositelnost, a já bych tvrdil, že je srozumitelnější pro někoho, kdo zná shell stejně dobře, jako by měl, pokud ' znovu používají prostředí shell než osmičkové úniky. '\'' je něco, co by měl každý, kdo provádí skriptování prostředí shell, internalizovat jako způsob, jak uniknout jednoduchým uvozovkám řetězec uvozovek s jednou uvozovkou, zejména proto, že řádky s uvozovkami v uvozovkách jsou robustním / přenosným / nejbezpečnějším způsobem, jak uniknout libovolným řetězcům ve všech skořápkách podobných Bourneovi. Alternativně však můžete dát kód awk do řetězce s dvojitými uvozovkami: awk "{print \"'\" \$0 \"'\" }"

Odpověď

Všimněte si Pokud k tomu nepotřebujete awk.

Místo toho můžete použít paste základní nástroj:

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

Bylo by to efektivnější a mělo by méně omezení než awk -based nebo sed řešení na základě.

Odpověď

Kód awk prostě musí být

{ print """ $0 """ } 

Můžete to dát do souboru, takže nemusíte nic citovat:

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

Nebo použijte řetězec uvozovek a unikněte uvozovkám a znaku dolaru:

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

Nebo v Bash / ksh / zsh použijte $"..." forma uvozovek, která vám umožní uniknout z jediné uvozovky uvnitř:

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

odpověď

můžete použít také příkaz sed.

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

nebo

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

Komentáře

  • Nebo sed -E "s/.*/'&'/" infile.
  • @chepner ano, přesunul jsem to do odpovědi :))

odpověď

jedna způsob, jak obejít řetězec v jednoduchých uvozovkách, je pomocí příkazu printf gnu xargs:

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

Perl

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

Používání GNU sed:

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *