Chcę dołączyć do każdego argumentu z pozycyjną liczbą argumentu. Chcę używać tylko zerowych bajtów jako separatora.
Poniżej tego chcę:

f() {
   for ((i=1;i<$(($#+1));++i)); do
     echo -n "$i"
     echo -ne "\x00"
     echo -n "${!i}"
     echo -ne "\x00"
   done
}

f a b c | hexdump -C
00000000  31 00 61 00 32 00 62 00  33 00 63 00              |1.a.2.b.3.c.|
0000000c

Chcę jednak usunąć pętlę (spowodować, że jest brzydkie) i używać rur i / lub podstawień procesowych. Tak więc pytanie jest naprawdę: jak dołączyć do dwóch rozdzielonych strumieniami bajtu zerowym za pomocą bajtu zerowego jako separatora. Próbowałem użyć pasty:

printf '%s\x00' "$@" | paste -z -d '\0' <(seq $# | tr '\n' '\0') -

Ale kiedy wywołująca pastę z -d'\0' pasta wklei żaden ogranicznik. Bez określenia rozliczeniowego, pasta używa zakładki. Czy istnieje sposób, w jaki mogę wykonać pasty Użyj Bajtu NULL jako ogranicznik kolumny? Czy istnieje kolejne narzędzie, które tutaj zadziała?

0
KamilCuk 4 czerwiec 2018, 17:14

3 odpowiedzi

Najlepsza odpowiedź

Wystarczy na kompletność, bez zapętlenia konstrukcji przy użyciu tylko printf (ale używa go dwa razy):

printf "$(printf '%d\\000%%s\\000' $(seq $#))" "$@"

Wewnętrzny printf tworzy łańcuch formatowy prepopulowany z numerami sekwencji. \000 jest konieczne, aby zapobiec cyfr na początku interpolowanych strun włączonych do kodu ucieczki.

1
rici 4 czerwiec 2018, 15:48

Pętla nie jest problemem; To twoje użycie pętli.

f () {
  local i
  for ((i=1; i<=$#; i++)); do
    printf '%d\0%s\0' "$i" "${!i}"
  done
}

Lub prawdopodobnie

f () {
  i=1
  for arg; do
    printf '%d\0%s\0' "$((i++))" "$arg"
  done
}

Co będzie działać w każdej skorupce POSIX, chociaż nadpisuje globalną i.

1
chepner 4 czerwiec 2018, 14:28

for Odpowiedź pętli przez Chepner jest bardzo prosty w użyciu i zdecydowanie dba o kwestię brzydoty

Tak jak alternatywa jest tutaj sposób na to bez pętli:

paste -zd $'\01' <(seq $# | tr '\n' '\0') <(printf '%s\0' "$@") | tr '\1' '\0'

Ten paste wkleja oba strumienie z {x1}} jako ogranicznik kolumny i ostatnie {x2}} command konwertuje \01 do \0 (Nul) bajt.

1
anubhava 4 czerwiec 2018, 14:43