[+]Wycinanie treści jednego pliku z drugiego

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2324
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

[+]Wycinanie treści jednego pliku z drugiego

Post autor: LordRuthwen »

Temat wydawało by się banalny, ale no chyba nie do końca :P
Plik wejściowy w formacie konfiguracji do backuppc:

Kod: Zaznacz cały

$Conf{BackupFilesOnly} = {
  '/var/vmail/vmail1/domena.pl' => [
    ''
  ],
  '/etc' => [
    ''
  ]
};
$Conf{XferMethod} = 'tar';
$Conf{XferLogLevel} = '2';
$Conf{ClientNameAlias} = '8.8.8.8';
$Conf{RsyncShareName} = [
  '/etc',
  '/var/vmail/vmail1/domena.pl'
];
$Conf{RsyncClientPath} = '/usr/bin/rsync';
$Conf{RsyncClientCmd} = '/usr/bin/sudo $rsyncPath $argList+ $shareName';
$Conf{RsyncClientRestoreCmd} = '/usr/bin/sudo $rsyncPath $argList+ $shareName';
$Conf{RsyncArgs} = [
  '--numeric-ids',
  '-a',
  '--hard-links',
  '--block-size=2048',
  '--specials'
];
$Conf{TarShareName} = [
  '/etc',
  '/var/vmail/vmail1/domena.pl/p/o/s/postmaster',
  '/var/vmail/vmail1/domena.pl/asdasdasd',
  '/var/vmail/vmail1/domena.pl/fdgsdfgsdf',
  '/var/vmail/vmail1/domena.pl/sdgdfbsdfb',
  '/var/vmail/vmail1/domena.pl/sdfvzcxv',
  '/var/vmail/vmail1/domena.pl/sruhyegrtefs',
  '/var/vmail/vmail1/domena.pl/dutyrseafsd',
  '/var/vmail/vmail1/domena.pl/z',
  '/var/vmail/vmail1/domena.pl/aersrjhtgdfv',
  '/var/log/archive'
];
$Conf{FullPeriod} = '30';
$Conf{IncrLevels} = [
  '1',
  '2',
  '3',
  '4',
  '5',
  '6',
  '7',
  '8',
  '9',
  '10',
  '11',
  '12',
  '13',
  '14',
  '15'
];
$Conf{BlackoutPeriods} = [
  {
    'hourEnd' => '17.5',
    'weekDays' => [
      '1',
      '2',
      '3',
      '4',
      '5'
    ],
    'hourBegin' => '7'
  }
];
Za pomocą takiego awka uzyskuję to co mam wyciąć z tego pliku:

Kod: Zaznacz cały

awk '/TarShareName/,/];/' conf.pl  > to_usunac
w postaci:

Kod: Zaznacz cały

$Conf{TarShareName} = [
  '/etc',
  '/var/vmail/vmail1/domena.pl/p/o/s/postmaster',
  '/var/vmail/vmail1/domena.pl/asdasdasd',
  '/var/vmail/vmail1/domena.pl/fdgsdfgsdf',
  '/var/vmail/vmail1/domena.pl/sdgdfbsdfb',
  '/var/vmail/vmail1/domena.pl/sdfvzcxv',
  '/var/vmail/vmail1/domena.pl/sruhyegrtefs',
  '/var/vmail/vmail1/domena.pl/dutyrseafsd',
  '/var/vmail/vmail1/domena.pl/z',
  '/var/vmail/vmail1/domena.pl/aersrjhtgdfv',
  '/var/log/archive'
];
I teraz jak usunąć co jest w pliku to_usunac z pliku conf.pl?
Czego próbowałem i z jaki efektem:

Kod: Zaznacz cały

comm --nocheck-order -3 conf.pl to_usunac
comm --nocheck-order -13 conf.pl to_usunac
Zwraca mi cały plik (3) lub tylko to co mam wyciąć.

Kod: Zaznacz cały

awk 'FNR==NR { a[$0]; next } !($0 in a)' to_usunac conf.pl > conf2.pl
wygląda fajnie, ale wycina nadmiarowe ];

Kod: Zaznacz cały

diff --changed-group-format="%>" --unchanged-group-format="" to_usunac conf.pl > conf2.pl
To wygląda najlepiej, z tym, że:

Kod: Zaznacz cały

diff conf.pl conf2.pl 
26,37d25
< $Conf{TarShareName} = [
<   '/etc',
<   '/var/vmail/vmail1/domena.pl/p/o/s/postmaster',
<   '/var/vmail/vmail1/domena.pl/asdasdasd',
<   '/var/vmail/vmail1/domena.pl/fdgsdfgsdf',
<   '/var/vmail/vmail1/domena.pl/sdgdfbsdfb',
<   '/var/vmail/vmail1/domena.pl/sdfvzcxv',
<   '/var/vmail/vmail1/domena.pl/sruhyegrtefs',
<   '/var/vmail/vmail1/domena.pl/dutyrseafsd',
<   '/var/vmail/vmail1/domena.pl/z',
<   '/var/vmail/vmail1/domena.pl/aersrjhtgdfv',
<   '/var/log/archive'
69d56
< ];
Czyli wycina poprawnie poza ostatnią linią, ]; z sekcji którą chciałem usunąć zostaje, natomiast znika ]; z końca pliku.
Do tego próby z grepami, sedami awkami tr, perlem... no rozbijam się o znaki ${} i multilinię.
Awatar użytkownika
lizard
Beginner
Posty: 287
Rejestracja: 08 lutego 2016, 18:47

Re: Wycinanie treści jednego pliku z drugiego

Post autor: lizard »

diff + patch?
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Re: Wycinanie treści jednego pliku z drugiego

Post autor: mariaczi »

@LordRuthwen, takie coś mi pykło:

Kod: Zaznacz cały

sed -r '/^\$Conf\{TarShareName\}\s=\s\[/{:1; /\$Conf\{TarShareName\}(\s.*)\];$/!{N; b1;}; d;};' test.conf
Nie do końca jest to optymalne - nie mogę wykombinować krótszego początku :(

Co i jak się w tym sed'zie dzieje wyjaśnione tutaj: https://stackoverflow.com/questions/325 ... c-search-s
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2324
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Re: Wycinanie treści jednego pliku z drugiego

Post autor: LordRuthwen »

mariaczi pisze: 11 listopada 2020, 14:19 @LordRuthwen, takie coś mi pykło:

Kod: Zaznacz cały

sed -r '/^\$Conf\{TarShareName\}\s=\s\[/{:1; /\$Conf\{TarShareName\}(\s.*)\];$/!{N; b1;}; d;};' test.conf
Nie do końca jest to optymalne - nie mogę wykombinować krótszego początku :(

Co i jak się w tym sed'zie dzieje wyjaśnione tutaj: https://stackoverflow.com/questions/325 ... c-search-s
Dziękować!
Ja miałem problemy w sedzie z {} - niby stosowałem notację \{TarShareName\}, ale za każdym razem mi się pluł o błędny argument {\}.
lizard pisze: 11 listopada 2020, 13:12 diff + patch?
W sumie nie pomyślałem :D
Zablokowany