LINUX.ORG.RU

Как в SED обработать диапазон строк?

 , диапазон


0

1

Есть такой текст:

...
[AC]
icon=battery-charging

[AC][DPMSControl]
idleTime=3600

[AC][HandleButtonEvents]
lidAction=64
powerButtonAction=8

[Battery]
icon=battery-060

[Battery][DPMSControl]
idleTime=300

[Battery][HandleButtonEvents]
lidAction=64
powerButtonAction=16

[LowBattery]
icon=battery-low

[LowBattery][BrightnessControl]
value=30

[LowBattery][HandleButtonEvents]
lidAction=64
powerButtonAction=16
...

Я хочу обработать диапазон строк между:
[AC][HandleButtonEvents]
...
[.*

В этом диапазоне надо изменить значение powerButtonActions.

Я пытаюсь сделать так:
cat f.txt | sed /\[AC\]\[HandleButtonEvents\]/,/\[.*/s/powerButtonAction\s*=\s*.*/powerButtonAction=125/

Но получаю ошибку:

sed: -e выражение #1, символ 81: незавершенное адресное регулярное выражение

Вопрос: как правильно написать эту команду?

★★★★★
$ cat -n /tmp/1.txt
1  [AC]
2  icon=battery-charging
3
4  [AC][DPMSControl]
5  idleTime=3600
6
7  [AC][HandleButtonEvents]
8  lidAction=64
9  powerButtonAction=8
10
11  [Battery]
12  icon=battery-060
13
14  [Battery][DPMSControl]
15  idleTime=300
16
17  [Battery][HandleButtonEvents]
18  lidAction=64
19  powerButtonAction=16
20
21  [LowBattery]
22  icon=battery-low
23
24  [LowBattery][BrightnessControl]
25  value=30
26
27  [LowBattery][HandleButtonEvents]
28  lidAction=64
29  powerButtonAction=16
$ sed -r '8,20s/(powerButtonAction=).+$/\1125/' /tmp/1.txt
[AC]
icon=battery-charging

[AC][DPMSControl]
idleTime=3600

[AC][HandleButtonEvents]
lidAction=64
powerButtonAction=125

[Battery]
icon=battery-060

[Battery][DPMSControl]
idleTime=300

[Battery][HandleButtonEvents]
lidAction=64
powerButtonAction=125

[LowBattery]
icon=battery-low

[LowBattery][BrightnessControl]
value=30

[LowBattery][HandleButtonEvents]
lidAction=64
powerButtonAction=16

Или погугли как менять в строках между двумя паттернами совпадений.

kardjoe
()
Ответ на: комментарий от kardjoe

sed -r '8,20s/(powerButtonAction=).+$/\1125/' /tmp/1.txt

Ты написал выделение диапазона с указанием конкретных номеров строк

Или погугли как менять в строках между двумя паттернами совпадений

Так именно об этом и разговор. Моя команда не срабатывает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от kardjoe

Что у тебя за команда, я не знаю. В требованиях [.* это что? Любая открывающая квадратная скобка?

Да, чтобы выделять до любой следующей секции.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от futurama

почему sed expression не в одинарных кавычках?

Так тоже не работает:

cat f.txt | sed /\[AC\]\[HandleButtonEvents\]/,/\[.*/'s/powerButtonAction\s*=\s*.*/powerButtonAction=125/'

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Что «да»? :) Это был риторический вопрос. Определи, чем рейнж оканчивается четче. Это начало ближайшей строки, которая начинается с [ или это последняя возможная строка, которая начинается с [? Короче, если менять до [LowBattery] будет так

sed -r '/\[AC\]\[HandleButtonEvents\]/,/\[LowBattery\]/s/(powerButtonAction=).+/\1125/'
kardjoe
()
Ответ на: комментарий от kardjoe

Определи, чем рейнж оканчивается четче.

Очевидно, это начало ближайшей строки, которая начинается с [

Ведь не факт, что следующая секция будет именно [LowBattery].

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Используй пустую строку, если у тебя такой порядок форматирования блок -> пустая строка

sed -r '/\[AC\]\[HandleButtonEvents\]/,/^$/s/(powerButtonAction=).+/\1125/'

Или замени пустую строку на \[.

kardjoe
()
Последнее исправление: kardjoe (всего исправлений: 2)
Ответ на: комментарий от kardjoe

Используй пустую строку, если у тебя такой порядок форматирования блок -> пустая строка

В формате INI и иже с ним пустые строки не являются показателем форматирования.

Поэтому правильно срабатывает такое выражение:

sed -r '/\[AC\]\[HandleButtonEvents\]/,/^\[.*/s/(powerButtonAction=).+/\1125/'

Xintrea ★★★★★
() автор топика

Чёто мне кажется, что на перле, или awk это сделать гораздо проще.

Binkledum
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.