2013-05-30 7 views
5

Ich habe eine Datei Zeilen wieErsetzen/Löschen von Sonderzeichen innerhalb angepasst Strings in sed

I want a lot <*tag 1> more <*tag 2>*cheese *cakes. 

enthält ich die * innerhalb <> aber nicht außerhalb zu entfernen versuchen. Die Tags können komplizierter sein als oben. Zum Beispiel <*better *tag 1>.

Ich versuchte /\bregex\b/s/\*//g, die für Tag 1, aber nicht für Tag 2 funktioniert. Also, wie kann ich es auch für Tag 2 arbeiten lassen?

Vielen Dank.

+0

Können Sie haben verschachtelt '<>'? –

+0

In meinem Fall wird es kein verschachteltes <> geben. Prost. – ToonZ

Antwort

3

Obligatorische Perl Lösung:

perl -pe '$_ = join "", 
     map +($i++ % 2 == 0 ? $_ : s/\*//gr), 
     split /(<[^>]+>)/, $_;' FILE 

anhängen:

+0

+1 für die '/// e' One-Liner –

+0

Great Perl Einleiner. +1 von mir auch. – ToonZ

3

einfache Lösung, wenn Sie nur ein Sternchen in Tag haben

sed 's/<\([^>]*\)\*\([^>]*\)>/<\1\2>/g' 

Wenn Sie mehr haben, können Sie sed goto Label-System

sed ':doagain s/<\([^>]*\)\*\([^>]*\)>/<\1\2>/g; t doagain' 

Wo doagain ist Label for-Schleife verwenden können, t doagain ist bedingter Sprung zum Label doagain. Beachten Sie die sed Handbuch:

t label 

Branch to label only if there has been a successful substitution since the last 
input line was read or conditional branch was taken. The label may be omitted, in 
which case the next cycle is started. 
+0

Danke für die Loop-Lösung. :-) – ToonZ

+0

Sie haben nach sed Lösung gefragt :) Ich bin froh, dass es Ihnen geholfen hat;) – bartimar

1

awk könnte Ihr Problem lösen:

awk '{x=split($0,a,/<[^>]*>/,s);for(i in s)gsub(/\*/,"",s[i]);for(j=1;j<=x;j++)r=r a[j] s[j]; print r}' file 

besser lesbare Version:

awk '{x=split($0,a,/<[^>]*>/,s) 
     for(i in s)gsub(/\*/,"",s[i]) 
     for(j=1;j<=x;j++)r=r a[j] s[j] 
     print r}' file 

Test mit Ihren Daten:

kent$ cat file 
I want a lot <*tag 1> more <*tag 2>*cheese *cakes. <*better *tag X*> 

kent$ awk '{x=split($0,a,/<[^>]*>/,s);for(i in s)gsub(/\*/,"",s[i]);for(j=1;j<=x;j++)r=r a[j] s[j]; print r}' file 
I want a lot <tag 1> more <tag 2>*cheese *cakes. <better tag X> 
+0

Ich bin nicht vertraut mit der 4-Argument-Version von 'Split', was ist das vierte Argument? – Lorkenpeist

Verwandte Themen