Extrahieren Sie ein Element aus Zeilen einer Textdatei

Extrahieren Sie ein Element aus Zeilen einer Textdatei

Der Befehl grepdruckt 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, grepum nur das zu fangen word?

Antwort1

So für Word:regulä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 awkWeg:

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 grepAusgabe nachträglich zu filtern, um tralle Vorkommen des Zeichens zu löschen *:

grep -x '\*\*[^*]*\*\*' | tr -d '*'

Ich empfehle außerdem, das Flag von GNU grep wie oben zu verwenden, -xum 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.

sedAlternative

Sie können auch das Flag von sed nutzen, pum in einem einzigen Befehl abzugleichen, zu ersetzen und zu drucken:

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'

verwandte Informationen