Замена строки в файле содержимым другого файла, но размещение содержимого X строк после совпадения - PullRequest
0 голосов
/ 28 июня 2019

У меня есть файл для обновления с некоторыми новыми данными.Новые данные внутри другого файла.Я сам кое-что решил.

Однако обновленный текст должен соответствовать 7 строкам после сопоставления с моим шаблоном

Я сделал попытку, выполнив команду grep -A 7, назначив ее last_details.

Это, конечно, назначает 7 строк переменной (я думаю, список), поэтому это вызывает проблемы для более позднего sed.

last_details=$(grep -A7 ${last_string} /var/tmp/sym_links.ini.$$)
sed "/^${last_details}$/r ${tmp_symlinks_file_part_2}" /var/tmp/sym_links.ini.$$ > /var/tmp/sym_links.ini.$$.tmp2

Так что я хочу, чтобы вывод шел из

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

до

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_11]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

Но вместо этого я получаю ошибку

sed: -e expression #1, char 24: unterminated address regex

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Это может сработать для вас (GNU sed):

sed '/\[DWH_DBSPACES_MAIN_10\]/!b;:a;N;s/\n/&/7;Ta;r insertFile' file

Сосредоточиться на линии, которую нужно сопоставить.Добавьте семь строк, введя цикл, затем добавьте нужный файл.Пространство шаблонов будет напечатано до того, как вставленный файл будет помещен в выходной поток.

NB Введенный цикл использует тот факт, что при добавлении строки в пространство шаблонов добавляется новая строка.Таким образом, предложение может быть изготовлено путем замены новой строки самой (или нет) и использования теста t для успешной замены или в этом случае T для противоположного.

0 голосов
/ 28 июня 2019

Ваш вопрос слишком сосредоточен на том, КАК вы хотите это сделать, и поэтому отсутствует информация о том, ЧТО вы пытаетесь сделать. Если вы просто пытаетесь добавить новый блок текста после какого-либо другого блока текста в файле, где все блоки разделены пустыми строками, то вот как это сделать:

awk -v RS= -v ORS='\n\n' -F'\n' -v str='[DWH_DBSPACES_MAIN_10]' '
    NR==FNR{new=$0; next} {print} $1==str{print new}
' newstuff file

Например, используя следующие входные файлы:

$ cat file
[DWH_DBSPACES_MAIN_09]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_12]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

.

$ cat newstuff
[DWH_DBSPACES_MAIN_11]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

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

$ awk -v RS= -v ORS='\n\n' -F'\n' -v str='[DWH_DBSPACES_MAIN_10]' 'NR==FNR{new=$0; next} {print} $1==str{print new}' newstuff file
[DWH_DBSPACES_MAIN_09]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_10]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_11]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=

[DWH_DBSPACES_MAIN_12]
Path=/eniq/database/dwh_main_dbspace/dbspace_dir_10/main_10.iq
Lun_ID=
Size=121668
Type=fs
Link=
Disk=
...