Was sind Replstrs wie {}?

Was sind Replstrs wie {}?

In der Dokumentation xargswird ein „replstr“ erwähnt, den das -IFlag übernimmt. Ich begann, darüber zu lesen, als ich diesen Befehl zum Ausführen fand fswatch:

fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}

und begann, die Manpage fürxargs

-I replstr
        Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
        specified) arguments to utility with the entire line of input.  The resulting arguments, after replacement is done, will not be
        allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
        the constructed arguments to utility, up to 255 bytes.  The 255 byte limit does not apply to arguments to utility which do not
        contain replstr, and furthermore, no replacement will be done on utility itself.  Implies -x. 

Wenn ich über den Begriff „replstr“ nachdenke, scheint er wahrscheinlich so etwas wie „read evaluate print loop string“ zu bedeuten. Ist das die Abkürzung? Ich habe angefangen, damit herumzuspielen, um eine Vorstellung davon zu bekommen, was es {}tut, aber ich bin mir nicht sicher, ob ich es schon wirklich verstehe:

➜  scripts git:(master) ✗  {0..3}
zsh: command not found: 0..3
➜  scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜  scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜  scripts git:(master) ✗ echo {a..d}
a b c d
➜  scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜  scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {}

➜  scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs

Zum Beispiel echo {a..3}ergibt das für mich wirklich keinen Sinn. Es scheint definitiv so, als würde es etwas in der Art von „ersetze diese Liste von Zeichenfolgen hier“ bewirken, aber ich bin mir nicht sicher, ob das die richtige Sichtweise ist. Außerdem bin ich mir nicht sicher, ob es {}sich um einen bestimmten Typ von Replstr handelt und ob es mehr gibt oder ob ein Replstr einfach irgendetwas zwischen einem Paar geschweifter Klammern ist. Ich würde mich über eine Anleitung zu Replstrs und ihrer Herangehensweise freuen.

Antwort1

replstrbedeutet „Ersatzzeichenfolge“ oder „Ersetzungszeichenfolge“.

Der ursprüngliche replstr ist {}. Er wurde zuerst mit der findBefehlsklausel eingeführt exec, wo er durch jeden gefundenen Dateinamen ersetzt wurde, z. B.

find /tmp -name "foo*" -exec echo file {} found \;

wird angezeigt, vorausgesetzt, dass zwei Dateien dem Muster entsprechen:

file foo1 found
file foo2 found 

Der xargsBefehl ermöglicht dasselbe mit Argumenten, die aus an die Standardeingabe übergebenen Zeichenfolgen erstellt wurden, und ermöglicht auch die Angabe von etwas anderem als der {}Ersatzzeichenfolge.

Beachten Sie, dass sich der Standard-Replstr einfach {}ohne Inhalt innerhalb der geschweiften Klammern befindet. Letztere werden für verschiedene Zwecke verwendet, z. B. Bereiche, wie Sie bereits bemerkt haben, oder Parametererweiterung.

Antwort2

Das -IArgument funktioniert folgendermaßen: -I whateverbedeutet, dass Vorkommen von wörtlich whateverdurch das Befehlsargument ersetzt werden. Demo:

$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c

Sehen Sie? xargsIch habe jede der Zeilen a, b, und genommen cund sie anstelle von fin eingesetzt echo hey f hey f.

Es besteht kein {}Zusammenhang.

Die -IOption ist POSIX. GNU xargsdokumentiert eine veraltete -iOption, die sich bei Aufruf als -iwhateverwie verhält -I whatever. Bei Aufruf als -iverhält sie sich wie -I {}. In diesem Fall {}werden Vorkommen von ersetzt. {}ist eindeutig von einer Funktion von inspiriert find: seinem -execPrädikat.

Die {a..b}Bash foo{a,b,c}bar-Syntax, die durch ihre „Klammererweiterung“ verarbeitet wird, {}hat keine besondere Bedeutung und wird unverändert an einen Befehl übergeben. (Wenn dies nicht der Fall wäre, würde dies standardkonforme, häufig vorkommende findAufrufe beschädigen.)

Antwort3

Das {...}ist dasErweiterung der Shell-Klammer, das Listen wie {a,b,c}(wird zu a, bund c) und Zahlenfolgen wie {0..13}(wird zu den Zahlen 0, 1... 12, 13) oder Zeichen {a..d}( a, b, c, d) unterstützt. (Die Klammererweiterung hat nichts mit dem {}von verwendeten Platzhalter zu tun xargs.)

Die etwas seltsame Sequenz, die {a..3}sich zu erweitert, erklärt sich durch dieASCII-Zeichentabelle. Da es asich bei nicht um eine Zahl handelt, werden beide als Zeichen betrachtet und die Erweiterung erfolgt durch alle Zeichen zwischen aund 3durch den numerischen Wert der Zeichencodes. Da zufällig anach kommt 3, setzt sich die Sequenz abwärts durch die Großbuchstaben und die Zahlen 9 bis 3 fort.

Wie man sieht, ist das Mischen von Buchstaben und Zahlen in einem solchen Bereich nicht sehr sinnvoll, könnte es aber {a..z}sein {A..Z}, ebenso wie ähnliche „ [a-z]und [A-Z]“ in regulären Ausdrücken und Shell-Globs. (Das heißt, wenn Sie den Rest der Buchstaben ignorieren können.)

verwandte Informationen