Píšem POSIX shell funkciu, ktorá vypíše jeho argumenty ako TSV záznam.
Každý argument je utiekol s týmito pravidlami:
\n
pre newline\t
na karte\r
pre carriage return\\
pre spätné lomítka
Je tu funkcia:
#!/bin/sh
tsv_print() {
rec=
for str in "$@"
do
esc=
i=${#str}
until [ $i -eq 0 ]
do
end="${str#?}"
chr="${str%"$end"}"
case $chr in
"$__TAB__") chr='\t' ;;
"$__LF__") chr='\n' ;;
"$__CR__") chr='\r' ;;
\\) chr='\\' ;;
esac
esc="$esc$chr"
str="${end}"
i=$((i-1))
done
rec="$rec${rec:+"$__TAB__"}$esc"
done
# echo "$rec"
printf '%s\n' "$rec"
}
S — bolestivé, aby si v kód — znaky uložené vopred a dopĺňa takto:
__TAB__=$(printf '\t')
__CR__=$(printf '\r')
__LF__="
"
Ja by som chcel vedieť:
Prečo nie je môj kód uniknúť znakov na všetkých?edit: Ako @GordonDavisson poukázal,
echo
bola vinníka!! Pomocouprintf
zdá sa, že iba prenosné spôsobom, s nákladmi možné vidlice.Je tam lepšie, špecifikácii POSIX, spôsob ako to urobiť?
awk
ased
nezdá vhodné pre prácu...Ako by ste robiť osn úteku?
edit: Ako @KamilCuk publikované v jeho odpoveď, a
printf '%b'
by stačiť; v TSV záznam má správny formát, pre ktoré.
postscript
Na konci, funkcia nebol potrebný, pretože vstup nemal obsahovať ľubovoľný znak escape. Povedal, že, vstupný formát nebolo, že rovno-dopredu, ktorú chcete previesť. Bol to STAR Súbor s rôznou počet stĺpcov na riadok (obmedzenie linky na 80 znakov max) a obsahujú kótované reťazce...
vstup:
...
loop_
_refl_0201 _refl_0012 _refl_2003 _refl_1600 _refl_1304 _refl_1305 _refl_1800
_refl_1801 _refl_1802 _refl_1803 _refl_1804 _refl_1805 _refl_1806 _refl_1701
_refl_1700 _refl_1202
'0 0 6' .147364 Z000020c1 .41 1 78.45 3.501 35.2221 -35.2221 0 -1.6055 -3.0963
-36.7288 -5.0964 39.3109 5.909983 '0 0 12' .294551 Z000010c1 .9 1 48.44 2.3805
39.910008 39.9101 .268379-04 1.75598 3.09745 41.6656 3.09809 47.8384 0 .939517
...
výstup (separátory sú karty):
_refl_0201 _refl_0012 _refl_2003 _refl_1600 _refl_1304 _refl_1305 _refl_1800 _refl_1801 _refl_1802 _refl_1803 _refl_1804 _refl_1805 _refl_1806 _refl_1701 _refl_1700 _refl_1202
'0 0 8' .147364 Z000020c1 .41 1 78.45 3.501 35.2221 -35.2221 0 -1.6055 -3.0963 -36.7288 -5.0964 39.3109 5.909983
'0 0 14' .294551 Z000010c1 .9 1 48.44 2.3805 39.910008 39.9101 .268379-04 1.75598 3.09745 41.6656 3.09809 47.8384 0.939517
...
printf
vôbec pre newline. Stačí vložiť newline v kótovaných reťazec.