Kombination von Klammererweiterung und Ausgangsumleitung

7

Oft verwende ich die Parametererweiterung in der Befehlszeile, z

cp a.{ext1,ext2}

das ist erweitert zu

cp a.ext1 a.ext2

In vielen Fällen verwende ich jedoch nicht cp, sondern ein anderes Tool, nennen wir es cat, und ich würde eine Ausgabeumleitung durchführen, wie z

cat a.ext1 > a.ext2

In meinem Fall akann es variieren oder ziemlich lang sein, daher möchte ich in der Lage sein, eine Art Klammererweiterung zu verwenden, die mindestens ein Vorkommen aim Einzeiler benötigt. Wie kann ich das bekommen?

Ich benutze speziell

$ bash --version
GNU bash, version 3.2.51(1)

Aber auch Antworten mit anderen Shells werden geschätzt.

Bernhard
quelle

Antworten:

11

Du kannst Tippen:

$ cat very-long-filename.ext1Ctrl+WCtrl+Y>Ctrl+YBackspace2

Oder:

$ cat very-long-filename.Ctrl+WCtrl+Yext1>Ctrl+Yext2

Beachten Sie Folgendes, um die Klammererweiterung wirklich zu nutzen:

cat a.ext1 > a.ext2

Kann auch geschrieben werden:

cat > a.ext2 a.ext1

Sie können jedoch nicht tun:

cat > a.ext{2,1}

Sie können jedoch Folgendes tun:

eval cat \> a.ext{2,1}
Stéphane Chazelas
quelle
Interessante Bearbeitung! Mit dem cat > a.ext{2,1}bekomme ich eine mehrdeutige Weiterleitung. Irgendeine Idee warum das so ist? Tut {etwas Besonderes?
Bernhard
@Bernhard du das mehrdeutige Umleitung in bashjeder Zeit passieren Sie etwas , das sich ausdehnt , um mehr als ein Argument an eine Umleitungsoperator. Gleich in a='a b'; echo > $a. Mit zsh, das würde einige mult_ios tun (die Ausgabe in beide Dateien abschlagen )
Stéphane Chazelas
Bedeutet das, dass bash die Umleitung vor der Erweiterung ausführt? Ich würde denken, dass es sich zuerst erweitert, dann operiert (im Grunde wie ein Alias), aber anscheinend ist meine Ansicht ein bisschen naiv.
Bernhard
Lustiges Detail: Funktioniert in zsh cat > a.ext{2,1} other_file. Aber es gibt den Inhalt other_filean beide a.ext1 und a.ext2. Ich weiß nicht, wie es gelingt, die Umleitung zu duplizieren.
Lgeorget
@lgeorget, wie gesagt, das ist die MultiOS verfügen , wodurch zshGeräte ein teeintern.
Stéphane Chazelas
2

Wie wäre es mit:-

f=really-long-filename; cat "$f.ext1" > "$f.ext2"
garethTheRed
quelle
Das funktioniert, ist aber nicht wirklich das, wonach ich suche, da ich das${PR}
Bernhard
1

Verwenden Sie eine Shell-Funktion

 xyx () { cat "$1".$2 > "$1".$3; }

dann

xyz fie foo fum

erweitert sich auf

cat fee.foo > fee.fum
Lenne
quelle
Erweiterungen .1und .2sind für mich normalerweise nicht universell.
Bernhard
Geänderte Antwort, um Parameter zu übernehmen.
Lenne