Обработка текста (конфига)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

xserver
Сообщения: 16

Обработка текста (конфига)

Сообщение xserver »

Есть текстовый файл с конфигом который нужно обработать:

Код: Выделить всё

# CONFIG_64BIT is not set
CONFIG_X86_32=y
# CONFIG_X86_64 is not set
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf32-i386"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_GPIO=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_DEFAULT_IDLE=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_ARCH_HAS_CPU_AUTOPROBE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_ARCH_HIBERNATION_POSSIBLE
CONFIG_ARCH_SUSPEND_POSSIBLE=y
# CONFIG_ZONE_DMA32 is not set
# CONFIG_AUDIT_ARCH is not set
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_HAVE_INTEL_TXT=y
CONFIG_X86_32_SMP=y


и есть другой файл типа:

Код: Выделить всё

CONFIG_IKCONFIG=m
CONFIG_OPROFILE=m
CONFIG_IOSCHED_DEADLINE=m
CONFIG_IOSCHED_CFQ=m
CONFIG_X86_32_IRIS=m
CONFIG_X86_MCE_INJECT=m
CONFIG_TOSHIBA=m
CONFIG_I8K=m
CONFIG_MICROCODE=m
CONFIG_X86_MSR=m
CONFIG_X86_CPUID=m
CONFIG_ACPI_EC_DEBUGFS=m
CONFIG_ACPI_AC=m
CONFIG_ACPI_BATTERY=m
CONFIG_ACPI_BUTTON=m
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=m
CONFIG_ACPI_PROCESSOR=m


нужно пройтись по первому файлу и все строки с "=y" сравнить со вторым файлом (до знака =) и если есть совпадение то в первом файле заменить в этих строках "y" на "m", все остальное оставить как есть.

Я читал описание sed/awk но
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Обработка текста (конфига)

Сообщение NickLion »

В sed/awk не силён. На perl будет так:

Код: Выделить всё

cat 1.in | perl -e 'my %x=();while(<>){@_=split/=/;$x{$_[0]}=$_[1]};while(<STDIN>){if(/^([^=]+)=y/ && exists $x{$1}){$_="$1=$x{$1}"} print"$_"}' 2.in
Спасибо сказали:
xserver
Сообщения: 16

Re: Обработка текста (конфига)

Сообщение xserver »

А можно пояснить где там что и как это работает?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Обработка текста (конфига)

Сообщение NickLion »

1.in — первый файл, 2.in — второй файл.
тут:

Код: Выделить всё

my %x=();while(<>){@_=split/=/;$x{$_[0]}=$_[1]}

построчно считывается содержимое из файла, указанного первым аргументом, разбивается по знаку "=", и заносится в хеш-массив.

далее:

Код: Выделить всё

while(<STDIN>){if(/^([^=]+)=y/ && exists $x{$1}){$_="$1=$x{$1}"} print"$_"}

также построчно считываем содержимое входа, если строка удовлетворяет регулярке "^([^=]+)=y" и если первый аргумент (то, что в скобках) есть в хеш-таблице, то меняем $_ (значение текущей строки) и выводим.
Спасибо сказали:
xserver
Сообщения: 16

Re: Обработка текста (конфига)

Сообщение xserver »

Спасибо работает!

Сделал такой скриптик на вашем коде:

Код: Выделить всё

#!/bin/bash
cat $1 | perl -e 'my %x=();while(<>){@_=split/=/;$x{$_[0]}=$_[1]};while(<STDIN>){if(/^([^=]+)=y/ && exists $x{$1}){$_="$1=$x{$1}"} print"$_"}' $2


проверяю
diff oldconf newconf
показывает что замены произведены.

(ручками это было не реально, в конфиге 5387 строк, а в списке модулей 3866)
Спасибо выручили .
Спасибо сказали: