Modifica o texto do campo específico dentro de citações duplas

1

Eu modifico tudo dentro de aspas duplas específicas. Exemplo do meu trabalho é:

<VALUE MAP_ID="1001" MAP="0" MAPNAME="BichonTown" SERVER="0" CHNSERVER="0" NEEDLEVEL="7" TIME="0" WEATHER="0" VEHICLE="1" PVP="0" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="DQ_910" MINIMAP="1001" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1002" MAP="0_000" MAPNAME="TownHall" SERVER="1" CHNSERVER="1" NEEDLEVEL="0" TIME="1" WEATHER="0" VEHICLE="0" PVP="1" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="5515" MINIMAP="0" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1003" MAP="0_001" MAPNAME="TownHall" SERVER="1" CHNSERVER="1" NEEDLEVEL="0" TIME="1" WEATHER="0" VEHICLE="0" PVP="1" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="0" MINIMAP="0" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1004" MAP="0_002" MAPNAME="TownHall" SERVER="1" CHNSERVER="1" NEEDLEVEL="0" TIME="1" WEATHER="0" VEHICLE="0" PVP="1" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="221" MINIMAP="0" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1005" MAP="1" MAPNAME="LostParadise" SERVER="1" CHNSERVER="1" NEEDLEVEL="7" TIME="0" WEATHER="0" VEHICLE="1" PVP="0" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="11" MINIMAP="1002" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" />

Tudo dentro do NORECONNECT="" deve ser definido como 0 , não há espaços apenas letras, números ou sublinhados. O resultado deve se parecer com

<VALUE MAP_ID="1001" MAP="0" MAPNAME="BichonTown" SERVER="0" CHNSERVER="0" NEEDLEVEL="7" TIME="0" WEATHER="0" VEHICLE="1" PVP="0" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="0" MINIMAP="1001" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1002" MAP="0_000" MAPNAME="TownHall" SERVER="1" CHNSERVER="1" NEEDLEVEL="0" TIME="1" WEATHER="0" VEHICLE="0" PVP="1" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="0" MINIMAP="0" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1003" MAP="0_001" MAPNAME="TownHall" SERVER="1" CHNSERVER="1" NEEDLEVEL="0" TIME="1" WEATHER="0" VEHICLE="0" PVP="1" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="0" MINIMAP="0" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1004" MAP="0_002" MAPNAME="TownHall" SERVER="1" CHNSERVER="1" NEEDLEVEL="0" TIME="1" WEATHER="0" VEHICLE="0" PVP="1" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="0" MINIMAP="0" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" /><VALUE MAP_ID="1005" MAP="1" MAPNAME="LostParadise" SERVER="1" CHNSERVER="1" NEEDLEVEL="7" TIME="0" WEATHER="0" VEHICLE="1" PVP="0" MINE="0" CONTROL="" ENTERLV="0" ENTERQUEST="0" ENTERITEM="0" NORECONNECT="0" MINIMAP="1002" VER="200" APPLY_ROW="0" MAP_EXP_RATIO="0" MAP_DROP_RATIO="0" MAP_MONEY_RATIO="0" ORDERLIST="0" />

Como posso conseguir isso?

    
por Rarara221 24.07.2016 / 19:05

2 respostas

5

Supondo que não há nenhum caractere " incorporado dentro desse campo, isso pode ser feito com uma ferramenta como sed

sed 's/NORECONNECT="[^"]*"/NORECONNECT="0"/'

A primeira expressão significa correspondência NORECONNECT=" seguida por zero ou mais caracteres não- " seguidos por " "

Então isso vai combinar coisas como

NORECONNECT="foo"
NORECONENCT="bar"
NORECONNECT=""

E, em seguida, substitua essa parte pela string

NORECONNECT="0"

EDITAR:

Se a palavra aparecer mais de uma vez em uma linha, adicione um g ao final:

sed 's/NORECONNECT="[^"]*"/NORECONNECT="0"/g'
    
por 24.07.2016 / 19:13
6

Isso parece XML, então não use regexps para editá-lo, use um analisador XML real como < hml="http://xmlstar.sourceforge.net/"> xmlstarlet :

xml ed -u '//VALUE/@NORECONNECT' -v 0 file.xml
    
por 24.07.2016 / 20:07