Der Befehl grep
druckt eine Zeile, wenn die Zeile eine Zeichenfolge enthält, die einem Ausdruck entspricht, was für die Suche nach angegebenen Inhalten nicht praktisch ist.
Ich habe zum Beispiel Vokabeldateien mit Formatierung
**word**
1. Definition:
2. Usage
3. Others
Ich möchte alle Wörter abrufen, um eine Wortliste in Dateien zu erstellen
grep '\*\*[^*]*\*\*'
Gibt den Großteil des Inhalts zurück.
Wie verwende ich es, grep
um nur das zu fangen word
?
Antwort1
So für Word:perlregulärer Ausdruck ( -P
) :
grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file
Ausgabe :
word
So etwas für Wörter:
grep -oP '^\s*\d+\.\s*\K\w+' file
Ausgabe :
Definition
Usage
Others
Antwort2
Es stehen mehrere Tools zur Verfügung, mit denen sich Wörter extrahieren lassen. Hier ist eine in sed implementierte Version:
sed '/^\*\*/!d' <your_file
Dieser Befehl sucht nach jeder Zeile in Ihrer Datei, die mit beginnt, **
und gibt sie aus. Die anderen Zeilen werden aus der Ausgabe gelöscht. Wenn Sie auch die Sterne entfernen möchten, können Sie den Befehl folgendermaßen erweitern:
sed '/^\*\*/!d;s/\*//g' <your_file
Darüber hinaus entfernt dieser Befehl alle *
Zeichen aus der Zeile, bevor sie gedruckt wird.
Antwort3
Mit awk
Weg:
awk -F'*\\*' 'NF>2{print $2}' infile
Beispiel für Testeingabe:
*wrd*
*woooord
**WRD
WORD**
woooooooooood*
**word**
die Ausgabe:
word
Antwort4
Wenn Ihnen die Verwendung zusätzlicher Tools nichts ausmacht, besteht eine sehr einfache Lösung darin, die grep
Ausgabe nachträglich zu filtern, um tr
alle Vorkommen des Zeichens zu löschen *
:
grep -x '\*\*[^*]*\*\*' | tr -d '*'
Ich empfehle außerdem, das Flag von GNU grep wie oben zu verwenden, -x
um nur ganze Zeilen abzugleichen und nicht versehentlich zu erkennen, dass **word**
in derselben Zeile Text umgeben von anderem Text erscheint. Dies kann auch den Musterabgleich beschleunigen, da nun viele potenzielle Übereinstimmungen frühzeitig verworfen werden können.
sed
Alternative
Sie können auch das Flag von sed nutzen, p
um in einem einzigen Befehl abzugleichen, zu ersetzen und zu drucken:
sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'