Как изменить значение переменной в разделе файла только?

Я ищу справку с использованием в качестве примера команды 'sed'. я хочу изменить значение переменной в разделе в текстовом файле, в этом примере я хочу изменить значение aaa в разделе [aaa] к новому значению, как изменить его с помощью sed или другая команда.

[aaa]
a= b 
c= aaa 
e = f 


[bbb]
a = b
c = aaa
e = f 
1
задан 6 March 2018 в 10:34

2 ответа

Попробуйте:

$ sed '/^\[aaa\]/,/^\[/{/^\[/b; s/aaa/NEW/}' file.ini
[aaa]
a= b 
c= NEW 
e = f 


[bbb]
a = b
c = aaa
e = f 

Как это работает

Общая команда выглядит как

/^\[aaa\]/,/^\[/{...}

Пара двух регулярных выражений, разделенных запятой, /^\[aaa\]/,/^\[/ определяет диапазон строк, начинающийся со строки, которая начинается с [aaa] и заканчивается следующей строкой, которая начинается с [. Для любой строки в этом диапазоне, но только строк в этом диапазоне, выполняются команды в фигурных скобках. Эти команды:

  1. /^\[/b

    Регулярное выражение /^\[/ ищет строки, начинающиеся с [. Для этих строк выполняется команда b. b расшифровывается как ветвление и указывает sed переходить мимо (пропускать) остальных команд.

  2. s/aaa/NEW/

    Для любой другой линии в диапазоне это говорит sed заменить любое вхождение aaa на NEW.

Более подробно, /^\[aaa\]/ является регулярным выражением, что литерал [ в начале строки, за которым следуют три a, за которыми следует литерал ]. [ и ] должны быть экранированы с помощью обратной косой черты, поскольку без обратной косой черты [ и ] являются активными символами регулярного выражения. Регулярное выражение /^\[ соответствует любой строке, которая начинается с [, где ^ - активный по регулярному выражению символ, который соответствует в начале строки, а \[ соответствует литералу [.

1
ответ дан 7 December 2019 в 15:23

Я предложил бы perl для этого - так как это поддерживает обе оперативных замены ( -i опция) и режим абзаца, например.

$ perl -00pe 's/aaa/XYZ/g if /^\[aaa\]/' file.ini
[XYZ]
a= b 
c= XYZ 
e = f 

[bbb]
a = b
c = aaa
e = f 

Если Вы хотите заменить aaa в разделе, но не в [aaa] заголовок раздела, затем можно исключить последнего с lookarounds:

$ perl -00pe 's/(?<!\[)aaa(?!\])/XYZ/g if /^\[aaa\]/' file.ini
[aaa]
a= b 
c= XYZ 
e = f 

[bbb]
a = b
c = aaa
e = f 

Выполнить оперативную замену:

perl -i -00pe 's/(?<!\[)aaa(?!\])/XYZ/g if /^\[aaa\]/' file.ini
0
ответ дан 7 December 2019 в 15:23

Другие вопросы по тегам:

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