2012-05-14 15 views
12

Ich schreibe das Skript, das nach Zeilen sucht, die mit einem Muster übereinstimmen. Ich muss sed für dieses Skript verwenden. Dies funktioniert gut für das Suchen und Druck mit Zeilen:Nummerierungszeilen, die mit sed dem Muster entsprechen

sed -n /PATTERN/p 

Allerdings würde Ich mag auch selbst die angepassten Linien Zahl vor der Linie zu drucken. Wie kann ich das mit sed tun?

+2

Haben Sie sie durchnumeriert wollen oder auf der Grundlage ihrer Zeilennummer innerhalb der Datei? –

Antwort

13

können Sie grep verwenden:

grep -n pattern file 

Wenn Sie = in sed die Zeilennummer verwenden auf einer separaten Zeile gedruckt werden und ist in dem Musterraum für die Manipulation nicht zur Verfügung. Sie können die Ausgabe jedoch in eine andere Instanz von sed pipen, um die Zeilennummer und die Zeile, auf die sie angewendet wird, zusammenzuführen.

sed -n '/pattern/{=;p}' file | sed '{N;s/\n/ /}' 
+0

das ist perfekt !! Sed Lösung funktioniert großartig. Vielen Dank! – almas

2

Wechseln Sie zu awk.

BEGIN { 
    ln=0 
} 

$0 ~ m { 
    ln+=1 
    print ln " " $0 
    next 
} 

{ 
    print $0 
} 

...

awk -f script.awk -v m='<regex>' < input.txt 
9

= wird verwendet, um die Zeilennummer zu drucken.

sed -n /PATTERN/{=;p;} 
+0

Ich mache das: Katze "$ FILE" | sed -n/"$ pattern"/{=; p;}, aber ich bekomme Fehler: Syntaxfehler in der Nähe von unerwartetem Token '} ' – almas

+0

Sie brauchen'; =; ... 'viel Glück. – shellter

+3

@zum: Verschieben Sie Ihre Anführungszeichen so, dass sie außerhalb des Skripts sind: 'sed -n"/$ pattern/{=; p;} "" $ FILE "' –

2

Perl verwenden:

perl -ne 'print "$.: $_" if /regex/' input.file 

$. enthalten Zeilennummer. Wenn Eingabedatei enthält:

record foo 
bar baz 
record qux 

Dieses Einzeiler: perl -ne 'print "$.: $_" if /record/' input.file druckt:

1: record foo 
3: record qux 

Oder wenn Sie gerade Gesamtzahl der Zeilen wollen abgestimmt ein Muster verwenden:

perl -lne '$count++ if /regex/; END { print int $count }' input.file

8

Für sed verwenden Sie die folgende Zeile, um die Zeilennummer

zu erhalten
1

Hier ist die einfachste Art und Weise:

awk '{print ln++ ": " $0 }' 
Verwandte Themen