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
Ваш случай проще, чем связанный случай -вам нужно только посмотреть на каждую строку (или "запись" на языке 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
Использование командыsed
w
:
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;
из командной строки.