chciałbym
$ echo a{b,c,d}
aby wyświetlić listę oddzieloną przecinkami, np
ab,ac,ad
zamiast zwykłego wyjścia
ab ac ad
Jak najłatwiej to zrobić w wierszu poleceń?
Zakładając, że elementy nie zawierają spacji, możesz przetłumaczyć spacje na przecinki:
echo a{b,c,d} | tr ' ' ,
który produkuje:
ab,ac,ad
Możesz także używać zakresów ze znakami:
echo a{b..d} | tr ' ' ,
Jest to szczególnie przydatne, jeśli chcesz mieć większy zasięg.
Wygląda na to, że bash nie używa $ IFS do łączenia wygenerowanych słów. Inną techniką byłoby przechowywanie wygenerowanych słów w tablicy, a następnie $ IFS będzie w grze:
Użyję podpowłoki, więc nie zmieniam IFS tej powłoki: wybierz jedną z
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
To emituje ciąg rozdzielający przecinki na standardowe wyjście. Jeśli chcesz to zrobić:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Jestem pewien, że jest na to wiele sposobów. Oto jedna metoda:
źródło
Rozwiń elementy, które pokazałeś, a następnie zapętl je, dodając przecinek do wszystkich oprócz pierwszej iteracji:
Wynik:
Zobacz podstawienie parametrów bash .
źródło
Oto rozwiązanie tylko dla bash.
Część przed średnikiem przypisuje
ab ac ad
się do zmiennej,IN
a druga część używa funkcji wyszukiwania i zamiany, aby zmienić wszystkie spacje na przecinki.//
Oznacza wszystkie mecze, a nie tylko pierwszego.Zrób to wszystko w podpowłoce (nawiasach), aby nie zanieczyszczać przestrzeni nazw.
źródło
Warto zauważyć, że w wielu kontekstach na takiej liście dopuszczalny jest przecinek końcowy. Jeśli akceptowalny jest przecinek końcowy, najłatwiejszym sposobem na zastąpienie jest
printf
:(Gdzie
some-command
jest polecenie, które działa na liście oddzielonej przecinkami i nie dba o przecinek końcowy.)W rzeczywistości, nawet jeśli nie musisz mieć przecinka, możesz użyć
printf
; wystarczy podać liczbę argumentów, których się spodziewasz, co sprawia, że jest niezgrabny w przypadku bardzo długich list:źródło