Unix sed дважды выводит следующий шаблон при замене

Есть много способов:

  1. Использование интерактивной оболочки в vim

    В редакторе-

    :sh
    rm textfile.xml
    
  2. Использование Bang (!)

    Как предложил DopeGhoti-

    :!rm textfile.xml
    
  3. Из по этой ссылке .

    Добавьте это в свой~/.vimrc

    command! -complete=file -nargs=1 Remove :echo 'Remove: '.''.' '.(delete() == 0 ? 'SUCCEEDED' : 'FAILED')
    

    Затем, in vim,

    :Remove testfile.xml
    
  4. Снова по той же ссылке в #3

    Используйте эту команду:

    :call delete(expand('%')) | bdelete!
    

0
20.01.2020, 14:31
2 ответа

Используйте инструмент, поддерживающий XML -, при работе с XML. Например, в xsh , оболочке XML ::LibXML , вы можете добиться результата с помощью

open logback-spring.xml ;
for //logger[@level='DEBUG'][appender-ref/@ref='logstash']
    set @level 'TRACE' ;
save :b ;

Если ваш XML содержит объявления пространств имен, код будет немного сложнее.

0
28.01.2020, 02:38

Учитывая правильно -сформированный XML-документ, подобный следующему (, измененному из вашего примера):

<?xml version="1.0"?>
<root>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="logstash"/>
      <appender-ref ref="Async-Appender"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="logstash"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="CONSOLE"/>
    </logger>
  </springProfile>
</root>

вы можете использовать xmlstarletдля изменения всех атрибутов level, для которых установлено значение DEBUG, на TRACEдля каждого узла logger, чей дочерний узел appender-refимеет атрибут ref, равный logstash, вот так:

$ xmlstarlet ed -u '//logger[appender-ref/@ref = "logstash"]/@level[. = "DEBUG"]' -v 'TRACE' file.xml
<?xml version="1.0"?>
<root>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="TRACE" additivity="false">
      <appender-ref ref="logstash"/>
      <appender-ref ref="Async-Appender"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="TRACE" additivity="false">
      <appender-ref ref="logstash"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="CONSOLE"/>
    </logger>
  </springProfile>
</root>

XPath-запрос, аналогичный что использует choroba , также будет работать:

xmlstarlet ed -u '//logger[@level = "DEBUG"][appender-ref/@ref = "logstash"]/@level' -v 'TRACE' file.xml
1
28.01.2020, 02:38

Теги

Похожие вопросы