2017-09-05 5 views
2

Also ich will nummerierte Liste von einem bestimmten Formular in ein anderes konvertieren.Wie sed verwenden, um Muster in mehreren Zeilen zu identifizieren

von dieser Form:

1. numberedlist 
2. one 
3. two 

dieser Form:

# numberedlist 
# one 
# two 

Ich mache weitere Änderungen an der Datei sed verwenden. daher möchte ich sed verwenden, um die erste Form immer dann zu identifizieren, wenn es passiert, und ohne Grenzen, auch wenn die nummerierte Liste mehr als 3 Elemente enthält.

Meine Gedanken über das Tun, das sind:

erste: eine Zeile mit dem Muster aufrufen (das ist eine Zahl> ein Punkt> ein Raum .... '[[:digit:]]\. ') dem Musterraum

Sekunde: Rufen Sie die nächste Zeile des Musters Space auf und prüfen Sie, ob sie '[[:digit:]]\. ' enthält oder nicht. und mach das solange, bis die nächste Zeile den Regex nicht anspricht. Dann ersetze es mit #s. aber ja, ich weiß nicht, ob das überhaupt möglich ist. Diese

ist, was ich bin jetzt mit:

s/[[:digit:]]\. /#/

aber ja, ich weiß, es ist nicht sehr effizient. Ich bin immer noch etwas neu in der sed Welt, also jede Hilfe geschätzt. Vielen Dank.

Edit: Entschuldigung für die Verwirrung Jungs, mein Ziel ist nur den Listenindex # zu ändern. irgendwelche Zahlen begannen von 1. bis nur #. Ich möchte nur nummerierte Listen in Abschriften für die automatische Nummerierung der Engine umwandeln.

Ich kann etwas wie s/[[:digit:]]\. /# / nicht verwenden, weil es irgendeine Stärke des Musters ändert, auch wenn es keine Liste ist.

+1

Dies ist nicht klar genug. Wie kommen Sie von Ihrem Eingabe-Beispiel zu der Ausgabe, nach der Sie fragen? Beginnt eine nummerierte Liste immer mit '1. nummerierte Liste? Was ist mit 3 passiert? Oder sagen Sie, Sie möchten den ersten Eintrag in der Liste löschen und dann für nachfolgende Einträge den Zähler um eins dekrementieren? Und wie planen Sie, sed zu arithmetisch zu machen? Ist Ihr Ziel, wie Ihre Frage nahelegt, wirklich "wie sed zu verwenden ...", oder sind Sie mehr daran interessiert, das gewünschte Ergebnis zu erzielen? – ghoti

+0

Ja die nummerierte Liste beginnt immer von 1 .. und immer in dieser Form digt.space. Ich muss nur die Listennummern in # umwandeln. – Mohamed

+0

suchen Sie auch, um Leerzeilen zu entfernen (wie Ihr Beispiel zu zeigen scheint)? Könntest du genug Zeilen haben, so dass du anfängst, in 2-/3-stellige Zahlen zu kommen, zB 10., 11. ..., 100., 101. – markp

Antwort

1

Eine mögliche sed Lösung:

sed -r 's/^[[:digit:]]+\. /# /g' <inputfile> 
  • -r: Suchmuster als erweiterte Regex
  • /^[[:digit]]+\. /# /g behandeln: Suchen Sie nach Zeilen, die mit 1 oder mehr Stellen durch einen Punkt und ein Leerzeichen beginnen, und falls gefunden, ersetzen Sie sie durch gefolgt von einem Leerzeichen
  • belassen Sie alle anderen Zeilen so wie sie sind (dh nehmen Sie keine Änderungen vor)

Zum Beispiel:

$ cat datfile 
1. numberedlist 
2. one 
3. two 
where in the world is waldo 
10. pickles 
15. jam 
# I'm just a comment 
sky blue 
100. bash 
101. ksh 
102. csh 
72.don't touch this 
# rubber ducky 

und einen Testlauf unseres sed Skript:

$ sed -r 's/^[[:digit:]]+\. /# /g' datfile 
# numberedlist 
# one 
# two 
where in the world is waldo 
# pickles 
# jam 
# I'm just a comment 
sky blue 
# bash 
# ksh 
# csh 
72.don't touch this 
# rubber ducky 
+0

Ich denke, das hat den Trick gemacht. Vielen Dank. – Mohamed

+0

Das '+' ist die ERE-Notation, die in einer Reihe von Nicht-GNU-Versionen von sed unter Verwendung der '-E'-Option unterstützt wird (ähnlich wie greps' -E'). Natürlich ist die POSIX-Kompatibilität in diesem Fall nicht schwierig, würde also denken, dass dies die bevorzugte Alternative ist. – ghoti

1

Nur awk verwenden:

$ echo "1. numberedlist 
2. one 
3. two 
55. fifty-five" | awk '{$1="#"} 1' 
# numberedlist 
# one 
# two 
# fifty-five 

Wenn Sie nur Linien erkennen mögen, dass Beginnen Sie mit Ziffern:

$ echo "1. numberedlist 
2. one 
3. two 
look ma no digit line 
55. fifty-five" | awk '/^[[:digit:]]+\. /{$1="#"} 1' 
# numberedlist 
# one 
# two 
look ma no digit line 
# fifty-five 

Aber, wenn Sie sed wollen:

$ echo "1. numberedlist 
2. one 
3. two 
look ma no digit line 
55. fifty-five" | sed 's/^[[:digit:]][[:digit:]]*\. /# /' 
# numberedlist 
# one 
# two 
look ma no digit line 
# fifty-five 
+0

Aber, aber .. die Frage war "Wie sed zu verwenden"! :-) Auch das erkennt die Listen in größeren Textteilen nicht. – ghoti

+0

* dies erkennt die Listen nicht innerhalb größerer Textkörper * Ich folge nicht. Dies funktioniert ähnlich wie "sed" in Textzeilen. Was auch immer der Nicht-Leerzeichen-Teil ist, wird in '#' – dawg

+1

konvertiert. Nun, Sie hatten den zweiten und dritten Code-Block noch nicht hinzugefügt, als ich den Kommentar hinzufügte. Ihre erste Lösung hätte offensichtlich "Look" durch "#" ersetzt. – ghoti

Verwandte Themen