Я ищу справку с использованием в качестве примера команды 'sed'. я хочу изменить значение переменной в разделе в текстовом файле, в этом примере я хочу изменить значение aaa в разделе [aaa] к новому значению, как изменить его с помощью sed или другая команда.
[aaa]
a= b
c= aaa
e = f
[bbb]
a = b
c = aaa
e = f
Попробуйте:
$ 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]
и заканчивается следующей строкой, которая начинается с [
. Для любой строки в этом диапазоне, но только строк в этом диапазоне, выполняются команды в фигурных скобках. Эти команды:
/^\[/b
Регулярное выражение /^\[/
ищет строки, начинающиеся с [
. Для этих строк выполняется команда b
. b
расшифровывается как ветвление и указывает sed переходить мимо (пропускать) остальных команд.
s/aaa/NEW/
Для любой другой линии в диапазоне это говорит sed заменить любое вхождение aaa
на NEW
.
Более подробно, /^\[aaa\]/
является регулярным выражением, что литерал [
в начале строки, за которым следуют три a
, за которыми следует литерал ]
. [
и ]
должны быть экранированы с помощью обратной косой черты, поскольку без обратной косой черты [
и ]
являются активными символами регулярного выражения. Регулярное выражение /^\[
соответствует любой строке, которая начинается с [
, где ^
- активный по регулярному выражению символ, который соответствует в начале строки, а \[
соответствует литералу [
.
Я предложил бы 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