Wie bekomme ich eine Linie mit einem Muster vor einer Zeilennummer?

420
Anthony

Ich muss eine Zeile bekommen, die mit einem Muster vor einer bestimmten Zeilennummer einer Datei übereinstimmt.

Beispiel:

linenum 1.fruits linenum 2.cherry linenum 3.apple . . linenum 7.orange linenum 8.apple2 . . . linenum 20.strawberry 

Aus der obigen Datei möchte ich line8. Ich weiß, dass es über Zeile 20 hinausgehen wird, und ich weiß, dass diese Zeile enthält apple.

1
Was möchten Sie mit line8 machen? Was hast du versucht? Die meisten Fragen können [hier] beantwortet werden (http://www.grymoire.com/unix/sed.html). AFH vor 5 Jahren 1
Nach welchen Kriterien (außer "_it has` apple ") arbeiten Sie? Nur eine Zeile über Zeile 20, die "Apfel" hat? Attie vor 5 Jahren 1
Bitte fügen Sie etwas Kontext hinzu und zeigen Sie Ihre Bemühungen, ansonsten sieht das aus wie eine Übung, um `sed` zu lernen. simlev vor 5 Jahren 0

3 Antworten auf die Frage

1
Kamil Maciorowski

Obwohl der Tag , wird meine Antwort nicht verwendet sed.

Der folgende Befehl nimmt die ersten 19 Zeilen, verwirft die Zeilen ohne appleund gibt die letzte Zeile von den verbleibenden zurück:

head -n 19 | grep "apple" | tail -n 1 

So bearbeiten Sie eine Datei mit dem Namen file.txt:

<file.txt head -n 19 | grep "apple" | tail -n 1 
1
Attie

Hier ist eine Lösung mit sed:

sed -n '20,$d;/apple/h;19' 
  • -n - das Drucken von Zeilen unterdrücken
  • 20,$d- Für jede Zeile vom 20Ende der Datei ( $) aus löschen ( d)
  • /apple/h- /apple/Kopieren Sie jede Zeile, die der Regex entspricht, in den " Leerraum " ( h).
  • 19- 19Vertauschen Sie das Muster online und halten Sie die Leerzeichen ( x) und drucken Sie den Musterbereich ( p).

Beachten Sie, dass Sie 19für den endgültigen Druck eine Zeile verwenden müssen, da alle nachfolgenden Zeilen gelöscht werden. Andernfalls können Sie die Adresse " letzte Zeile " verwenden $.


In diesem Test habe ich appleZeile 23 hinzugefügt .

$ sed -n '20,$d;/apple/h;19' < file linenum 8.apple2 
0
simlev

Gleiche Lösung wie bereits gebucht, diesmal in Perl:

perl -lane 'if(1..19 and /apple/){$a=$_} END' input.txt 

und AWK:

awk 'NR<20 && /apple/ END' input.txt