использовать два файла в качестве входных данных с помощью sed

Похоже, вы пытаетесь скомпилировать модуль ядра Linux на FreeBSD.

Хотя и Linux, и FreeBSD являются Unix -подобными операционными системами, они используют ядра, которые во многих аспектах полностью отличаются друг от друга. Это означает, что фрагмент кода ядра (или модуль ядра, например ), написанный специально для ядра Linux, не будет компилироваться и/или работать в системе FreeBSD.

Именно в таких ситуациях кто-то со знанием ядра FreeBSD и его архитектуры и, по крайней мере, с общим знанием ядра Linux, может подумать о том, чтобы сесть на порт драйвера из Linux во FreeBSD.. Это включает в себя преобразование основной работы драйвера во что-то, что соответствовало бы тому, как ядро ​​FreeBSD делало бы аналогичные вещи.

Это предприятие, которое потребует времени и знаний.

Поскольку я не знаком с драйвером или с FreeBSD в большей степени, я, к сожалению, не могу сказать, поддерживаются ли устройства, которые поддерживает драйвер, FreeBSD.

0
27.08.2019, 16:59
2 ответа

Даны два файла с именами "старые"...

$ cat old
old1
old2
old3

и «новый»

$ cat new
new1
new2
new3

Вы можете создать файл сценария для sed следующим образом:

$ paste old new | while read old new; do printf "s/%s/%s/g\n" "$old" "$new"; done |tee sedfile
s/old1/new1/g
s/old2/new2/g
s/old3/new3/g

И используйте этот файл с sed:

sed -f sedfile mulipath.conf > review-this.conf
0
28.01.2020, 02:39
$ perl -e '
   open(F1,"<",shift);
   open(F2,"<",shift);
   while(<F1>) {
     chomp; # strip trailing \n from input file.
     $new=<F2>;
     chomp $new;
     print "s/$_/$new/g\n"
   }' file1.txt file2.txt
s/360002ac000000000000001f20001add7/60002ac000000000000001f20001accb/g
s/360002ac000000000000001f20001add8/60002ac000000000000001f20001accc/g
s/360002ac000000000000001f20001add9/60002ac000000000000001f20001accd/g
s/360002ac000000000000001f20001ade0/60002ac000000000000001f20001acce/g

Это могло быть (и было написано как )в один -лайнер, я добавил перевод строки, чтобы сделать его более читаемым.

Если file1.txtне имеет того же количества строк, что и file2.txt, этот скрипт выдаст ложный вывод для любых строк в одном файле, которым нет соответствующей строки в другом. Так что не делай этого.

Чтобы применить эти изменения к вашему multipath.confфайлу, запустите приведенный выше лайнер perl one -и перенаправьте вывод в файл (, например. sedscript.sed), а затем запустите:

sed -f sedscript.sed multipath.conf

Убедитесь, что сгенерированный sedскрипт делает то, что вы хотите, а затем либо перенаправьте вывод в новый файл, либо используйте параметр sed-iдля редактирования «в -месте» multipath.conf. Конечно, сначала сделайте резервную копию и скопируйте ее в безопасное место вне досягаемости-i(или даже-i.bak).

примеры входных файлов::

$ cat file1.txt 
360002ac000000000000001f20001add7
360002ac000000000000001f20001add8
360002ac000000000000001f20001add9
360002ac000000000000001f20001ade0

$ cat file2.txt 
60002ac000000000000001f20001accb
60002ac000000000000001f20001accc
60002ac000000000000001f20001accd
60002ac000000000000001f20001acce

Кстати, приложив немного больше усилий, этот лайнер perl one -можно было бы заставить читать в файле1 и файле2, создавать массив операций s/old/new/g, а затем применять их к третьему файлу (, например multipath.conf)

Например:

#!/usr/bin/perl

# run with three arguments:
# $1 = file containing old patterns
# $2 = file containing replacements
# $3 = file to modify

# THIS SCRIPT IS A CRUDE, MINIMALIST EXAMPLE AND CONTAINS NO ERROR
# CHECKING/HANDLING CODE AT ALL. USE AT OWN RISK.

use strict;
use File::Slurp;

# hash to store the search patterns and their replacements.
my %regex=();

open(F1,"<",shift);
open(F2,"<",shift);
while(<F1>) {
  chomp; # strip trailing \n from input file.
  my $new=<F2>;
  chomp $new;
  # qr// pre-compiles the regular expression, so it doesn't have to be
  # compiled on every pass through the loop.
  $regex{qr/$_/} = $new;
};
close(F1);
close(F2);

my $f3=shift;

my @file3=read_file($f3);

# transform and overwrite the third file.
open(F3,">",$f3);
foreach (@file3) {
  foreach my $key (keys %regex) {
        s/$key/$regex{$key}/g;
  }
  print F3;
};
close(F3);
1
28.01.2020, 02:39

Теги

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