2013-03-11 1 views
1

Я хочу удалить знак равенства только в том случае, если не, за которым следует 3D. Вот пример.sed/awk delete equals if NOT follow 3D

NB2HI4B2F4XWM3LNFZCGK3DJOZSXE6L=PNZSS4Y3PFZZWGSZB5GUTGKPLE=ONZXA33PNZSXEQ 

Так это должно стал

NB2HI4B2F4XWM3LNFZCGK3DJOZSXE6LPNZSS4Y3PFZZWGSZB5GUTGKPLEONZXA33PNZSXEQ 

Если возможно я мог иметь решение в awk и sed? Я знаю, что здесь есть много объяснений о том, как это сделать, но регулярное выражение не так просто в начале.

ответ

1

К сожалению, ни поддержки sed ни awklook-arounds, и вы действительно хотите использовать отрицательный смотреть вперед здесь, чтобы соответствовать всем = не следует 3D (?!3D). Оба python и perl поддерживают взгляды.

Один из способов с python:

>>> import re 
>>> print re.sub('=(?!3D)','','=3D=3=1=D3D====3D') 
=3D31D3D=3D 

Один из способов с perl:

$ perl -pe 's/=(?!3D)//g' <<< "=3D=3=1=D3D====3D" 
=3D31D3D=3D 
+0

кажется работающим спасибо;) еще одна вещь Если бы я удалял equals, если не следует 3D ** и ** другое равно? – marcodv

+0

@marcodv Просто добавьте лишний '=' в look-ahead, поэтому '= (?! 3D =)' будет соответствовать только '=', а не '3D ='. –

0

грязный и быстрый AWK один вкладыш:

awk '{gsub(/=3D/,"\x99");gsub(/=/,"");gsub(/\x99/,"=3D")}1' file 

тест:

kent$ echo "====xxx==yy=3D=3Dyy==zz=3D="|awk '{gsub(/=3D/,"\x99");gsub(/=/,"");gsub(/\x99/,"=3D")}1'  
xxxyy=3D=3Dyyzz=3D 
0

Это может работать для вас (GNU СЭД):

sed 's/=3D/\n/g;s/=//g;s/\n/=3D/g' file 
Смежные вопросы