Как разделить текстовый файл на несколько файлов на основе шаблонов начала строк?

merge_config.shфрагменты конфигурации

$ cd linux
$ git checkout v4.9
$ make x86_64_defconfig
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]'.config
# CONFIG_DEBUG_INFO is not set
$ # GDB_SCRIPTS depends on CONFIG_DEBUG_INFO in lib/Kconfig.debug.
$ cat <.config-fragment
> CONFIG_DEBUG_INFO=y
> CONFIG_GDB_SCRIPTS=y
> EOF
$ # Order is important here. Must be first base config, then fragment.
$./scripts/kconfig/merge_config.sh.config.config-fragment
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]'.config
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y

Замена процесса не к сожалению не работает:

./scripts/kconfig/merge_config.sh arch/x86/configs/x86_64_defconfig \
    <( printf 'CONFIG_DEBUG_INFO=y\nCONFIG_GDB_SCRIPTS=y\n' ) 

из-за:https://unix.stackexchange.com/a/164109/32558

merge_config.sh— это простой передний конец -для мишени make alldefconfig.

При кросс-компиляции ARCHнеобходимо экспортировать при запуске merge_config.sh, т.е.:

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
./scripts/kconfig/merge_config.sh.config.config-fragment

Объединенный выходной файл можно явно указать с помощью переменной окружения KCONFIG_CONFIG; в противном случае он просто перезаписывает.config:

KCONFIG_CONFIG=some/path/.config./scripts/kconfig/merge_config.sh.config.config-fragment

Buildroot автоматизирует это с помощьюBR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES:https://stackoverflow.com/questions/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

Связанные:https://stackoverflow.com/questions/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file

2
20.06.2021, 02:27
2 ответа

Ваш случай проще, чем связанный случай -вам нужно только посмотреть на каждую строку (или "запись" на языке awk )и решить, куда ее отправить. Так:

awk '/^#here/{print > "here.txt"; next} /^#there/{print > "there.txt"; next} {print}' input.txt

Остальные строки будут напечатаны на стандартный вывод; переносимо, вы можете перенаправить это в третий файл (rest.txt, скажем ), а затем переименовать его в имя оригинала. Если у вас есть GNU awk, вы можете использовать модуль inplaceдля изменения исходного файла напрямую:

gawk -i inplace '/^#here/{print > "here.txt"; next} /^#there/{print > "there.txt"; next} {print}' input.txt
5
28.07.2021, 11:23

Использование командыsedw:

sed -n -e '/^#here/w here.txt' -e '/^#there/w there.txt' data

Чтобы сохранить ряд, который не начинается с нужного шаблона:

sed -n -e '/^#here/w here.txt' -e '/^#there/w there.txt' -e '/^$/d;' -e '/^#/!w new_data.txt' data

Это sedприменяет совпадение к строке и записывает его в соответствующий файл.

Если строка не имеет тегов(/^#/!)и не пуста (/^$/), то запишите строку в файл с именем new_data.txt, файл со всеми строками без тегов.

Если вы хотите оставить пустую строку, удалите -e /^$/d;из командной строки.

4
28.07.2021, 11:23

Теги

Похожие вопросы