Как с помощью команды sed вставить строку перед первой строкой, которая соответствует заданному шаблону?

Как с помощью команды `sed` (GNU sed) версии 4.9.0.32.5420 вставить строку ZZZ перед первой строкой, которая начинается с XXX, в файле, содержащем строки? 

В качестве примера, если у нас есть исходные строки: 
```
AAA
BBB
CCC
XXX
AAA
XXX
XXX
```
Мы хотим получить в результате:
```
AAA
BBB
CCC
ZZZ
XXX
AAA
XXX
XXX
```

Я уже использую команду, которая вставляет ZZZ перед каждой строкой, начинающейся с XXX:
```bash
sed '/^XXX/i ZZZ' tes.txt
```
Существует ли способ ограничить действие команды так, чтобы она вставляла ZZZ только перед первой строкой XXX в диапазоне от начала файла до первой строки, начинающейся с XXX? 
``` 
1,/^XXX/ 
```
  • 27 декабря 2024 г. 9:43
Ответы на вопрос 3
Да, вы можете использовать команду `sed`, чтобы вставить строку только перед первой строкой, которая соответствует заданному шаблону. Для вашей задачи, когда нужно вставить строку `ZZZ` перед первой строкой, начинающейся с `XXX`, вы можете использовать следующую команду:

```bash
sed '0,/^XXX/{s/^/ZZZ\n/; t; d;}' tes.txt
```

Давайте разберем эту команду:

1. `0,/^XXX/` — это диапазон адресации. Он указывает на поиск от начала файла (0) до первой строки, которая соответствует шаблону `^XXX`.
2. `{s/^/ZZZ\n/; t; d;}` — это набор команд в фигурных скобках:
   - `s/^/ZZZ\n/` — заменяет начало первой строки, который соответствует `^XXX`, добавляя `ZZZ` в виде новой строки перед ней.
   - `t` — если предыдущая команда `s` была успешной (т.е. если замену произвели), то выполнение команды `t` остановится и дальнейшие команды не будут выполнены.
   - `d` — команда, которая удаляет все последующие строки, которые соответствуют этому диапазону, таким образом, не добавляя `ZZZ` перед другими строками, которые начинаются с `XXX`.

Таким образом, команда вставляет `ZZZ` только перед первой строкой, которая соответствует заданному шаблону.

Вы можете протестировать эту команду, запустив её на вашем файле `tes.txt`, и вы получите ожидаемый результат.
sed '0,/^XXX/{s/^XXX/ZZZ\nXXX/}' tes.txt
echo 'AAA
BBB
CCC
XXX
AAA
XXX
XXX' | sed '0,/XXX/ {/XXX/iZZZ
}'
Похожие вопросы