Como combinar e substituir um valor de atributo dentro de uma tag

1

Estou tentando substituir o valor do nó a seguir usando o comando sed.

<KeyValue key="EMPTY_SEARCH_CRITERIA" type="String" value="CS_CODE" comment="Configured empty search criteria."/>

Estou usando o caractere curinga, pois o valor inicial pode conter qualquer valor de string. Por exemplo,

sed -e 's/value=.*/value="SN_CODE,CS_ID" comment="Configured empty search criteria."\/\>/g' CMS_conf.xml > tempfile
         ^        ^                                                                     ^

Mas, nesse caso, também preciso incluir o atributo de comentário.

Existe alguma maneira de conseguir isso sem inserir o atributo de comentário?

    
por Menon 18.05.2015 / 11:25

3 respostas

1

Eu usaria o dialeto perl de expressões regulares. Se você estiver em um sistema com sed , provavelmente terá perl.

Dado

<KeyValue key="EMPTY_SEARCH_CRITERIA" type="String" value="CS_CODE" comment="Configured empty search criteria."/>

Perl Regex

perl -i -pe 's/(value=)".*?"/"some_replacement_string"/g' <filename>

Notas

Você pode querer testar isso primeiro, primeiro imprimindo no terminal.

perl -pe 's/(value=)".*?"/"some_replacement_string"/g' <filename>

Ou crie um backup com extensão .bak

perl -i.bak -pe 's/(value=)".*?"/"some_replacement_string"/g' <filename>

Expressão Regular Explicada:

  • (): agrupar como variável \ 1
  • ": as citações são literais por causa da expressão com aspas simples, portanto não há necessidade de evitá-las.
  • ?: serve para domar *, o que significa que ele irá parar de devorar na primeira partida (e não continuar mastigando até a final ". sed não suporta operadores não-gananciosos, mas você pode usar o truque na outra resposta [^"]*" , que significa engolir todos os caracteres que não estão "up até a". Isso efetivamente faz a mesma coisa nesse caso.
por 24.11.2016 / 23:24
0

Se você quiser alterar particularmente o CS_CODE com o SN_CODE, CS_ID, poderá usar:

's/CS_CODE/SN_CODE,CS_ID/g'

Se os valores forem diferentes, você pode usar

's/value=\S*\S/value="SN_CODE,CS_ID"/g'
    
por 18.05.2015 / 11:47
0

sed não é a opção mais brilhante para o processamento em html (ou qualquer outra linguagem de programação), mas de qualquer forma:

sed -e 's/\(value\)="[^"]*"/="SN_CODE,CS_ID"/'

Dois pontos talvez não óbvios:

  • com \( e \) agrupamos um padrão para usá-lo mais tarde com
  • [^"]* é usado para corresponder a qualquer caractere, mas "
por 18.05.2015 / 11:42