Mit grep + sed
Dadurch wird der Inhalt dieser beiden Zeichenfolgen analysiert:
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
Oben wird nach einer Zeichenfolge gesucht, die dem Muster entspricht ".*"
. Das passt zu allem, was in doppelten Anführungszeichen steht. So grep
werden diese Arten von Werten zurückgegeben:
"arch"
"arch2"
Die Pipe zum sed
Entfernen von doppelten Anführungszeichen aus diesen Zeichenfolgen gibt Ihnen die Zeichenfolgen, nach denen Sie suchen. In der Notation sed 's/"//g'
wird angewiesen sed
, alle doppelten Anführungszeichen zu suchen und durch nichts zu ersetzen s/"//g
. Der Befehl s/find/replace/g
ist das, was dort vor sich geht, und der g
Suchpfad weist ihn an, dies global für die gesamte angegebene Zeichenfolge zu tun.
Mit nur sed
Sie können auch verwenden sed
, um das anfängliche doppelte Anführungszeichen abzuschneiden, den Abstand zwischen ihnen beizubehalten und das verbleibende Anführungszeichen abzubrechen.
$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2
Andere Methoden
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
Mit dem Befehl tr
können Zeichen gelöscht werden. In diesem Fall werden die doppelten Anführungszeichen gelöscht.
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
Mit grep
der PCRE-Funktion von können Sie nach Unterzeichenfolgen suchen, die mit einem doppelten Anführungszeichen beginnen oder mit einem doppelten Anführungszeichen enden, und nur die Unterzeichenfolge melden.
tr -d \"
ist eine andere Möglichkeit, die Anführungszeichen zu löschen. (tr
Übersetzt normalerweise einen Zeichensatz in einen anderen;-d
/address/
tosed
like hinzufügen , könnensed '/^"\(arch[^"]*\)/s//\1/
Sie nur Zeilen bearbeiten , die diesen String enthalten.sed
wirklich tun sollten,s/^"\([^"]*\)".*/\1/
nur für den Fall, dass nur zwei doppelte Anführungszeichen in der Zeile stehen.Das ist ein weiterer Job für
cut
:quelle
cut
Teilt jede Zeile in Felder unter Verwendung des Anführungszeichens als Trennzeichen und gibt dann Feld 2 aus: Feld 1 ist die leere Zeichenfolge vor dem ersten Anführungszeichen, Feld 2 ist die gewünschte Zeichenfolge zwischen den Anführungszeichen und Feld 3 ist der Rest der Linie.Mit
sed
können Sie:Erläuterung:
s/.../.../
- anpassen und ersetzen^
- Spiel am Zeilenanfang\(...\)
- Dies ist eine Rückreferenz, wir können auf das verweisen, was hier später mit übereinstimmt\1
[^"]*
- Übereinstimmung mit einer Sequenz, die kein a enthält"
(dh bis zur nächsten)"
).*
- Passen Sie den Rest der Linie an\1
- durch die rückseitige Referenz ersetzenOder mit
awk
:Beachten Sie, dass Sie in modernen Shells anstelle einer normalen Variablen auch ein Array verwenden können. In können
bash
Sie tun:Dies ist möglicherweise einfacher, wenn Sie die Variable verwenden.
quelle
Mit bash würde ich schreiben:
quelle
Und die durch Grep Oneliner mit
--perl-regexp
Option,Erläuterung:
(?<=^\")[^"]*
-> Hier wird ein Lookbehind verwendet. Es stimmt mit jedem Zeichen überein, jedoch nicht mit"
null oder mehreren Übereinstimmungen (sobald es doppelte Anführungszeichen findet, hört es auf, übereinzustimmen), die direkt nach doppelten Anführungszeichen stehen (nur die Zeile, die mit doppelten Anführungszeichen beginnt).Ein weiterer hässlicher Hack durch
sed
,quelle
Da Regex gierige und nicht gierige Modi hat, würde es nicht wie gewünscht extrahiert, wenn Sie mehrere Ziele in derselben Zeile haben. Linie:
Ziel:
Befehl (gieriger Modus):
Befehl (nicht gieriger Modus):
quelle