1

Я новичок в Unix. Я хотел бы обработать этот файл.

PP_NAME_1
jprovider|J Driver Provider|${J_DRIVER_PATH}/jcc;${J_DRIVER_PATH}/jcc_license_cu|${J_DRIVER_NATIVEPATH}|com.jcc.Connection
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_ias|chuchchu|password|CHCHCH|4|serverName|portNumber
save
PP_NAME_2
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
save
PP_NAME_3
classPath|/mm/ja/lib
customProperty|AppContent.Directory|-8
customProperty|javx.toreType|-8
customProperty|javax.tore|-8
Alias|461bdhk_host|123.45.67.89|10000
source|BDBDDS|dbc/chuchchu|JDriver Provider|node/chuchchu_s|chuchchu|password|CHCHCH|4|serverName|portNumber
Variable|J_DRIVER_PATH|
save
PP_NAME_4
classPath|/mm/ja/lib
Variable|J_DRIVER_PATH|
save

Я хотел бы извлечь строки рядом с шаблоном соответствия PP_NAME_1, чтобы сначала сохранить шаблон в FILE1

Затем строки, соответствующие шаблону PP_NAME_2, второму шаблону сохранения в FILE2 и т.д.

В оригинальном файле будут не пустые строки.

Вы будете наблюдать, строки различаются для каждого файла.

ФАЙЛ1 будет иметь 3 строки

FILE2 будет иметь 5 строк

FILE3 будет иметь 8 строк

а также

FILE4 будет иметь 3 строки.

Таким образом, строки будут меняться каждый раз, может быть более 50 строк.

1 ответ1

0

Используйте awk с PP_NAME_ в качестве разделителя записей:

awk -v RS='PP_NAME_' -v FS='\n' '/./ {print | "tail -n +2 >FILE"$1}' input

awk читает "запись" за раз и делит каждую запись на "поля". В этом случае использование RS='PP_NAME_' определяет запись как весь текст до следующего экземпляра символов PP_NAME_ . Разделитель полей, FS , равен новой строке. Это означает, что каждая строка является "полем". Определенный таким образом, каждая запись начинается со строки, содержащей номер файла, в который мы хотим записать запись. Фактическая запись записи в файл выполняется с помощью: print | "tail -n +2 >FILE"$1 . Поскольку $1 - это число, которое остается в первой строке, "FILE"$1 - это имя выходного файла, который мы хотим записать. Мы хотим записать все в записи в этот файл, кроме первой строки с номером. Использование команды оболочки tail -n +2 удаляет эту первую строку.

Первая прочитанная запись - это весь текст до первого появления PP_NAME_ . Это означает, что первая прочитанная запись пуста. Поскольку мы не хотим записывать это, регулярное выражение /./ помещается перед командой print . Это регулярное выражение соответствует любой непустой записи. Это означает, что он устраняет пустую запись, которую мы не хотели.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .