Wie kann ich den Abstand zwischen generierten Argumenten während der Klammererweiterung unterdrücken?

8

Ich habe den folgenden Befehl verwendet, um eine Liste der URLs zu erstellen, die ich testen möchte:

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Leider hatten die an urls.txtjeden angehängten URLs ein Leerzeichen vor sich (außer natürlich dem ersten). Ich verstehe, warum das passiert ist, und mir ist klar, dass ich es einfach durch einen sedAusdruck ausziehen kann, aber ich würde gerne wissen, ob es eine Möglichkeit gibt, es stattdessen zu unterdrücken. (Es mag albern und pedantisch erscheinen, aber es unterscheidet sich nicht von der Präferenz, die so viele Menschen empfinden, wenn sie Katzen nicht "missbrauchen" .)

Ich habe versucht, doppelte Anführungszeichen zu setzen , um die Wortaufteilung zu unterdrücken , aber das hat auch die Klammererweiterung unterdrückt, so dass dies ein No-Go war.

Ich habe versucht, IFS in eine leere Zeichenfolge zu ändern, aber es hat auch nicht funktioniert:

IFS='' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Es wurde auch nicht in eine neue Zeile geändert:

IFS='\n' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt
Bilderstürmer
quelle
Verwenden Sie Bash oder Zsh?
Braiam
Im Moment benutze ich Bash (ich bin auf der Arbeit), aber auf meinem eigenen Laptop benutze ich zsh. Ich hatte erwartet, dass die Klammererweiterung in beiden Fällen identisch funktioniert, aber vielleicht ist das nicht der Fall.
Bilderstürmer
In diesem Fall ist die Gnouc-Antwort am besten mit verschiedenen Shells kompatibel.
Braiam
Wäre Richards Antwort nicht gleichermaßen kompatibel? (Es hat auch den Vorteil, dass es einfacher ist, daher muss ich nicht aufhören und über die fummeligen Teile nachdenken, wenn ich es das nächste Mal verwenden möchte.) Andererseits ist Gnoucs Antwort auch ausgezeichnet. Und ich glaube, ich habe am meisten aus Glenn Jacksons Antwort gelernt. Leiaz 'Antwort scheint am einfachsten und elegantesten zu sein, ist aber natürlich nur zsh.
Bilderstürmer

Antworten:

8

Sie können die Klammererweiterung in einem Array speichern und dann wie gewünscht ausgeben:

urls=( localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} )

Dann

printf "%s\n" "${urls[@]}"

oder

(IFS=$'\n'; echo "${urls[*]}")

Das Echo-Beispiel sieht komisch aus, weil:

  1. Es wird in einer Unterschale (in Klammern) ausgeführt, damit ich meinen aktuellen IFS-Wert nicht ändere.
  2. IFS muss in einem separaten Befehl definiert werden:
    • Dies funktioniert nicht: IFS=$'\n' echo "${urls[*]}"Die Variable wird erweitert, bevor die neue env-Variable wirksam wird
    • IFS muss festgelegt werden, bevor Sie mit dem Erweitern von Variablen beginnen.

Beachten Sie auch den geringfügigen Unterschied im verwendeten Dereferenzierungsarray-Index:

  • [@] im printf-Beispiel, um das Array in einzelne Wörter zu erweitern
  • [*] im Echo-Beispiel, um das Array zu einem einzelnen Wort zu erweitern, wobei die Elemente durch das erste Zeichen von IFS getrennt sind
Glenn Jackman
quelle
Es ist ein harter Anruf, aber ich wähle diese Antwort, weil (1) es scheint, dass (AFAIK) dem erklärten Ziel der Unterdrückung am nächsten kommt, anstatt nur die Leerzeichen zu entfernen, und (2) ich am meisten daraus gelernt habe (a erklärtes Ziel meiner Frage).
Bilderstürmer
16

Verwenden Sie printfeingebautes:

$ printf %s\\n localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
localhost:8080/reports/promos/130
localhost:8080/reports/promos/130.pdf
localhost:8080/reports/promos/130.xls
localhost:8080/reports/promos/130.xlsx
localhost:8080/reports/promos/130.csv
localhost:8080/reports/promos/130.preload
localhost:8080/reports/promos/130-unburdened
localhost:8080/reports/promos/130-unburdened.pdf
localhost:8080/reports/promos/130-unburdened.xls
localhost:8080/reports/promos/130-unburdened.xlsx
localhost:8080/reports/promos/130-unburdened.csv
localhost:8080/reports/promos/130-unburdened.preload
....
cuonglm
quelle
6

Dies ist mit zsh getaggt, daher schlage ich das eingebaute zsh vor print:

print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}

-l druckt Argumente in separaten Zeilen.

Leiaz
quelle
+1 Danke - gut zu wissen! Ich werde das benutzen, wenn ich auf zsh bin. Ich habe es so markiert, einfach weil ich beide verwende und beide die Klammererweiterung unterstützen. (Ich weiß nicht, ob andere es tun, aber ich finde ksh schrecklich verwirrend, also bleibe ich weg.)
Bilderstürmer
3

Das Problem ist, dass die Klammererweiterung das Leerzeichen hinzufügt und das Echo die neue Zeile hinzufügt. Behandeln Sie die Newline nach dem Prinzip der Einzelverantwortung separat.

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} | tr " " "\n"
Strg-Alt-Delor
quelle
Ich denke, dies ist der einfachste und praktischste Ansatz
Bilderstürmer
Nein, bei der Erweiterung der Klammern wird kein Leerzeichen hinzugefügt, sondern es werden mehrere Argumente erstellt echo. Das ist, echodass seine Argumente durch Leerzeichen getrennt gedruckt werden.
Stéphane Chazelas
Ich denke, das Problem tritt auf, weil echoArgumente durch Leerzeichen getrennt werden und die neue Zeile zusätzlich vor jedem Leerzeichen eingefügt wird, anstatt das Leerzeichen zu ersetzen (was sinnvoller wäre). Aus dem Speicher, xargshat ein bekanntes Problem sehr ähnlich zu diesem (vor allem mit der -0Option)
Syntaxfehler