Ich möchte eine Zeichenfolge in einer Textzeile finden und die Zeichenfolge (zwischen Leerzeichen) und das erste Wort der Phrase drucken.
Beispielsweise:
"Dies ist eine einzelne Textzeile" "Etwas anderes" "Es ist besser, du versuchst es noch einmal." "Besser"
Die Liste der Zeichenfolgen lautet:
Text Sache Versuchen Besser
Ich versuche, eine Tabelle wie diese zu erhalten:
Dieser [Tab] Text Eine andere Sache Es [tab] versuchen Besser
Ich habe es mit grep versucht, aber es ist nichts passiert. Irgendein Vorschlag?
command-line
text-processing
regex
Felipe Lira
quelle
quelle
Antworten:
Bash / Grep-Version:
Nennen Sie es so:
Ausgabe:
quelle
Perl zur Rettung!
Speichern unter
first-plus-word
, ausführen alsAus den eingegebenen Wörtern wird ein regulärer Ausdruck erstellt. Jede Zeile wird dann mit dem regulären Ausdruck abgeglichen. Wenn eine Übereinstimmung vorliegt, wird das erste Wort gedruckt, und wenn es sich vom Wort unterscheidet, wird auch das Wort gedruckt.
quelle
Hier ist eine awk-Version:
Wo
file2
ist die Wortliste undfile1
enthält die Sätze.quelle
Hier ist die Python-Version:
Demo:
Randnotiz : Das Skript ist
python3
kompatibel, sodass Sie es entweder mitpython2
oder ausführen könnenpython3
.quelle
Versuche dies:
Wenn die Registerkarte vor dem
Better
ein Problem darstellt, versuchen Sie Folgendes:Das Obige wurde auf GNU sed (
gsed
unter OSX aufgerufen ) getestet . Für BSD sed sind möglicherweise einige geringfügige Änderungen erforderlich.Wie es funktioniert
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/
Dies sucht nach einem Wort,
[[:alnum:]]+
gefolgt von einem Leerzeichen,[[:space:]]
gefolgt von irgendetwas.*
, gefolgt von einem Ihrer Wörtertext|thing|try|Better
, gefolgt von irgendetwas. Wenn dies gefunden wird, wird es durch das erste Wort in der Zeile (falls vorhanden), eine Registerkarte und das übereinstimmende Wort ersetzt.ta; b; :a; s/^\t//; p
Wenn der Substitutionsbefehl zu einer Substitution führte, was bedeutet, dass eines Ihrer Wörter in der Zeile gefunden wurde, weist der
ta
Befehl sed an, zum Label zu springena
. Wenn nicht, verzweigen wir (b
) in die nächste Zeile.:a
definiert die Bezeichnung a. Wenn also eines Ihrer Wörter gefunden wurde, führen wir (a) die Ersetzung durchs/^\t//
, bei der eine führende Registerkarte entfernt wird, falls vorhanden, und (b) drucken (p
) die Zeile.quelle
Ein einfacher Bash / Sed-Ansatz:
Das
while read w; do ...; done < words
wird über jede Zeile in der Datei iterierenwords
und sie unter speichern$w
. Die-n
Markensed
drucken standardmäßig nichts. Dersed
Befehl ersetzt dann doppelte Anführungszeichen, gefolgt von Nicht-Leerzeichen (\"(\S*)
die Klammern dienen dazu, zu erfassen, was mit\S*
dem ersten Wort übereinstimmt , und wir können es später als bezeichnen\1
), 0 oder mehr Zeichen (.*
) und dann das Wort, nach dem wir suchen ($w
) und wieder 0 oder mehr Zeichen (.*
). Wenn dies übereinstimmt, ersetzen wir es nur durch das erste Wort, einen Tabulator und$w
(\1\t$w
) und drucken die Zeile (das ist, was derp
Eingangs///p
tut).quelle
Dies ist die Ruby-Version
Die Beispieltextdatei
hello.txt
enthältLaufen mit
ruby source.rb hello.txt
Ergebnissen inquelle