Píšu POSIX shell funkce, která vytiskne své argumenty jako TSV záznam.
Každý argument je, utekl s následujícími pravidly:
\n
pro newline\t
pro kartu\r
pro návrat vozíku\\
pro zpětné lomítko
Zde je funkce:
#!/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é číst v kódu — znaky uloženy předem takto:
__TAB__=$(printf '\t')
__CR__=$(printf '\r')
__LF__="
"
Chtěl bych vědět:
Proč není můj kód escape znaky?edit: Jako @GordonDavisson poukázal na to,
echo
byl viník!! Pomocíprintf
se zdá být pouze přenosné způsob, s náklady na případný fork.Je tam lepší, POSIX kompatibilní, způsob, jak to udělat?
awk
ased
nezdá vhodné pro práci...Jak by vám to un-vyhnout?
edit: Jako @KamilCuk publikováno v jeho odpověď,
printf '%b'
bude stačit; TSV záznam má správný formát.
postscript
Nakonec, funkce nebylo zapotřebí, protože vstupní neměl obsahovat jakýkoliv znak uniknout. To znamená, že vstupní formát nebyl tak přímočarý, jak převést. To byla HVĚZDA Souboru s různým počtem sloupců na řádek (omezení linky do 80 znaků) a obsahující uvedené řetězce...
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 jsou záložky):
_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
pro nový řádek. Stačí vložit nový řádek v řetězec v uvozovkách.