Я хочу найти все файлы, соответствующие шаблону (cs*.dat3) в текущей и подпапках, и вставить блок текста либо из файла, либо из переменной bash в заданную строку. Это может также быть после сопоставления с шаблоном в файле вместо заданной строки, но у меня

PRESSURE_RELIEF_PANELS
EXIT PRESSURE_RELIEF_PANELS

Так что материал будет вставлен дважды. К счастью, первый PRESSURE_RELIEF_PANELS всегда находится в строке 32, так что его можно использовать. Мой текущий взгляд таков:

find . -name cs*.dat3 -exec sed '33iblah' {} \;

Какие выводы

PRESSURE_RELIEF_PANELS
blah
EXIT PRESSURE_RELIEF_PANELS

Теперь вместо «мля» я хочу вставить блок текста. Этот текст хранится в файле, поэтому его можно либо временно сохранить в переменной bash, либо как-то прочитать в sed как путь или файл. Мне не удалось найти хорошее решение для этого, так как я не смог объединить оператор вставки sed (i) с оператором имени файла (r) .

Кто угодно?

3
Krøllebølle 10 Апр 2014 в 14:44

2 ответа

Лучший ответ

Вы можете использовать команду прочитать файл с адресом. Говоря:

sed '33rfile' input

Вставит файл с именем file после строки 33 в input.

Возможно, вы уже знаете, что r - это расширение GNU.

Цитирование из руководства:

`r FILENAME'

 As a GNU extension, this command accepts two addresses.

 Queue the contents of FILENAME to be read and inserted into the
 output stream at the end of the current cycle, or when the next
 input line is read.  Note that if FILENAME cannot be read, it is
 treated as if it were an empty file, without any error indication.

 As a GNU `sed' extension, the special value `/dev/stdin' is
 supported for the file name, which reads the contents of the
 standard input.
3
devnull 10 Апр 2014 в 10:51

Ты можешь сделать:

find . -name cs*.dat3 -exec sed -i.bak '/^PRESSURE_RELIEF_PANELS$/r file.dat' '{}' \;

Где file.dat будет содержать данные для вставки.

2
anubhava 10 Апр 2014 в 13:52