2012-04-03 16 views
1

Ich möchte eine Zeichenfolge ersetzen (im Beispiel das Wort Linux) mit was auch immer zwischen den # ist in der ersten Zeile.Verwenden Sie Sed, um eine Zeichenfolge durch eine andere aus einer Regex erhalten Zeichenfolge ersetzen

Deshalb möchte ich mich wenden:

#Windows# 
1. Linux Sysadmin, Linux Scripting etc. 
2. Databases - Oracle, mySQL etc. 
3. Security (Firewall, Network, Online Security etc) 
4. Storage in Linux 
5. Productivity (Too many technologies to explore, not much time available) 

in:

1. Windows Sysadmin, Windows Scripting etc. 
2. Databases - Oracle, mySQL etc. 
3. Security (Firewall, Network, Online Security etc) 
4. Storage in Windows 
5. Productivity (Too many technologies to explore, not much time available) 

oder

#Solaris# 
1. Linux Sysadmin, Linux Scripting etc. 
2. Databases - Oracle, mySQL etc. 
3. Security (Firewall, Network, Online Security etc) 
4. Storage in Linux 
5. Productivity (Too many technologies to explore, not much time available) 

in:

1. Solaris Sysadmin, Solaris Scripting etc. 
2. Databases - Oracle, mySQL etc. 
3. Security (Firewall, Network, Online Security etc) 
4. Storage in Solaris 
5. Productivity (Too many technologies to explore, not much time available) 

Nur mit sed. Ich habe so weit gekommen wie: sed ' /^ # [a-zA-Z] */{ h d } /Linux/G'

Ich denke, was ich tun muß, ist ist ein regulärer Ausdruck unter Verwendung des Haltepuffers als Ersatzmuster, das wie s/Linux/g aussehen würde, aber ich kann keinen Weg finden, dies zu tun. Wer hat irgendwelche Ideen?

Antwort

2

Hier eine Sed Lösung:

sed ' 
/^#.*#$/{      # if replacement text is matchd 
s/#//g       # remove all pound chars 
h        # copy pattern space to hold space 
d        # delete pattern space and start over 
}        # end if 
:a        # create label "a" 
G        # append hold to pattern 
s/Linux\(.*\)\n\(.*\)/\2\1/ # replace Linux with contents of hold space 
ta        # if above replacement succeeded, go to "a" 
s/\n.*//      # remove replacement text and print pattern space 
' file.txt 

One-Liner, wenn Sie ; Befehle trennen verwenden können:

sed '/^#.*#$/{s/#//g;h;d};:a;G;s/Linux\(.*\)\n\(.*\)/\2\1/;ta;s/\n.*//' file.txt 
+1

Warum der Schalter "-n"? – potong

+0

Interessant, ich hatte gedacht, dass ohne den Schalter "-n" es am Anfang der Ausgabe einen zusätzlichen Zeilenumbruch gab, aber ich habe es gerade wieder getestet, die Ausgabe sah korrekt aus. Habe gerade meine Antwort bearbeitet, um sie zu entfernen. –

3

Sie werden mit awk besser dran sein. Betrachten Sie dieses Skript:

awk '/^#/ {gsub("#", "", $0); txt=$0} {gsub("Linux", txt, $0); print}' file.txt 
+0

ich dies im Rahmen tun wollen einer Apache mod_sed-Direktive gibt es keine performante Möglichkeit, die Apache-Ausgabe über awk auszuführen. –

Verwandte Themen