2013-05-30 13 views
5

Mam plik zawierający wiersze jakWymień/usuwanie znaków specjalnych wewnątrz dopasowanych strun w sed

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

Próbuję usunąć * wewnątrz <> ale nie na zewnątrz. Znaczniki mogą być bardziej skomplikowane niż powyżej. Na przykład: <*better *tag 1>.

Próbowałem /\bregex\b/s/\*//g, który działa dla tagu 1, ale nie dla znacznika 2. Jak mogę więc sprawić, by działał również dla tagu 2?

Wielkie dzięki.

+0

można mieć zagnieżdżone '<>'? –

+0

W moim przypadku nie będzie zagnieżdżonego <>. Twoje zdrowie. – ToonZ

Odpowiedz

3

Obowiązkowe rozwiązanie Perl:

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

Dołącz:

+0

+1 dla jednosilnika 's /// e' –

+0

Wielki perl one-liner. +1 ode mnie też. – ToonZ

3

Proste rozwiązanie, jeśli masz tylko jedną gwiazdkę w tagu

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

Jeśli masz więcej, można użyć systemu etykiet sed goto

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

Gdzie doagain jest etykieta dla pętli t doagain jest warunkowym skokiem do etykiety doagain. Odnoszą się do sed instrukcji:

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

Dzięki za rozwiązanie pętli. :-) – ToonZ

+0

Zapytałeś o rozwiązanie sed :) Cieszę się, że ci pomogło;) – bartimar

1

awk może rozwiązać swój problem:

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 

wersja bardziej czytelny:

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 

testy z danymi:

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

Nie znam 4-argumentowej wersji 'split', jaki jest czwarty argument? – Lorkenpeist

Powiązane problemy