So geben Sie durch Kommas getrennte Zeichenfolgen mit der Bash-Klammer-Erweiterung aus


17

ich würde gerne

$ echo a{b,c,d}

um eine kommagetrennte Liste wie

ab,ac,ad

anstelle der üblichen Ausgabe

ab ac ad

Was ist der einfachste Weg, dies in der Kommandozeile zu tun?

Antworten:


9

Angenommen, die Elemente enthalten keine Leerzeichen, könnten Sie Leerzeichen in Kommas übersetzen:

echo a{b,c,d} | tr ' ' ,

welche produziert:

ab,ac,ad

Sie können auch Bereiche mit Zeichen verwenden:

echo a{b..d} | tr ' ' ,

Dies ist besonders nützlich, wenn Sie eine größere Reichweite wünschen.


13

Es scheint, dass Bash $ IFS nicht verwendet, um die generierten Wörter zu verbinden. Eine andere Technik wäre die erzeugten Wörter in einem Array zu speichern und dann IFS $ wird im Spiel sein:

Ich werde eine Subshell verwenden, damit ich die IFS dieser Shell nicht ändere: Wählen Sie eine aus

( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )

Das gibt den durch Kommas getrennten String an stdout aus. Wenn Sie es erfassen möchten:

joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )

Es ist nicht die erzeugten Worte überhaupt kommen. Das ist der springende Punkt, es wird erweitert, um Wörter zu trennen.
Stéphane Chazelas

5

Ich bin sicher, dass es viele Möglichkeiten gibt, dies zu erreichen. Hier ist eine Methode:

echo a{b,c,d} | sed 's/ /,/g'

2

Erweitern Sie die Elemente, wie Sie sie gezeigt haben, und führen Sie eine Schleife über sie aus. Fügen Sie dabei allen Elementen außer der ersten Iteration das Komma hinzu:

for i in a{b,c,d}; do
  u="${u:+$u, }$i"
done
echo "$u"

Ergebnis:

ab, ac, ad

Siehe bash-Parametersubstitution .


1

Hier ist eine reine Bash-Lösung.

(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad

Der Teil vor dem Semikolon wird ab ac adder Variablen zugewiesen INund der zweite Teil verwendet Suchen und Ersetzen, um alle Leerzeichen in Kommas zu ändern. Das //bedeutet alle Übereinstimmungen, nicht nur die erste.

Tun Sie alles in einer Subshell (in Klammern), um Ihren Namespace nicht zu verschmutzen.


1

Es ist erwähnenswert, dass in vielen Kontexten ein nachgestelltes Komma in einer solchen Liste zulässig ist. WENN ein nachgestelltes Komma zulässig ist, ist die einfachste Möglichkeit, die Ersetzung durchzuführen printf:

some-command "$(printf %s, a{b,c,d} )"

(Wo some-commandist ein Befehl, der auf einer durch Kommas getrennten Liste ausgeführt wird und sich nicht für ein nachgestelltes Komma interessiert?)

Selbst wenn Sie kein nachgestelltes Komma haben müssen, können Sie es verwenden printf. Sie müssen nur die Anzahl der erwarteten Argumente angeben, was es für sehr lange Listen ungeschickter macht:

some-command "$(printf %s,%s,%s a{b,c,d} )"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.