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
- Podobná otázka pro superuživatele .
Odpověď
Tady je několik způsobů:
-
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"
-
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 jakoawk -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