Знайсці і замяніць з дапамогай спісу ў тэкставым файле?

Я нават не ўпэўнены, калі гэта магчыма, але ўпэўнены, што я спадзяюся, што гэта.

У мяне ёсць гэты радок 766 раз у файле backup.xml:

*** Hosting Services

Я тады файл list.txt , які змяшчае 766 радкоў у ім. Мне трэба замяніць *** са зместам кожнай з 766 радкоў у list.txt - і ён павінен быць у тым жа парадку, калі наогул магчыма.

Загадзя дзякуй за любую дапамогу!

0
Вядома яго можна. Што вы спрабавалі? Ёсць толькі адзін асобнік *** . ці ёсць многія з іх?
дададзена аўтар Nate, крыніца
Вядома яго можна. Што вы спрабавалі? Ёсць толькі адзін асобнік *** . ці ёсць многія з іх?
дададзена аўтар Nate, крыніца
У мяне ёсць *** 766 раз backup.xml . Мне трэба кожны з гэтых выпадкаў замененыя на кожнай з ліній 766, якія знаходзяцца ў list.txt . Я ведаю, як знайсці і замяніць з дапамогай каманднага радка, але не магу знайсці нічога канчатковага аб тым, як зрабіць замену са спісу файлаў.
дададзена аўтар user2410854, крыніца
У мяне ёсць *** 766 раз backup.xml . Мне трэба кожны з гэтых выпадкаў замененыя на кожнай з ліній 766, якія знаходзяцца ў list.txt . Я ведаю, як знайсці і замяніць з дапамогай каманднага радка, але не магу знайсці нічога канчатковага аб тым, як зрабіць замену са спісу файлаў.
дададзена аўтар user2410854, крыніца

8 адказы

<�Моцны> Ідэя:

loop over the lines of the B(ackup file)
  if you (F)ind a B-line to change
     read the next line of the L(ist file)
     change
  print the line to R(result file)

<�Моцны> План:

read_open B
read_open L
write_open R
while (line from B)
  if (F) {
    read replacemment from L
    change line
  }
  print line to R
}
close R, L, B

<�Моцны> Рэалізацыя I (read_open, пятля, глядзець на B):

use strict;
use warnings;
use English qw(-no_match_vars);

my $bfn = '../data/AA-backup-xml';
open my $bfh, '<', $bfn or die "Can't read open '$bfn': $OS_ERROR";
while (my $line = <$bfh>) {
        print $line;
}
close $bfh or die "Can't read close '$bfn': $OS_ERROR";

выхад:

perl 01.pl
whatever
whatever
*** Hosting Services
whatever
whatever
whatever
*** Hosting Services
whatever
whatever
*** Hosting Services
whatever
whatever
whatever
*** Hosting Services

<�Моцны> Рэалізацыя II (чытанне/запіс, F, замяніць, першы вынік):

use Modern::Perl;
use English qw(-no_match_vars);

my $bfn = '../data/AA-backup-xml';
open my $bfh, '<', $bfn or die "Can't read open '$bfn': $OS_ERROR";
my $lfn = '../data/AA-list.txt';
open my $lfh, '<', $lfn or die "Can't read open '$lfn': $OS_ERROR";
my $rfn = '../data/AA-result';
open my $rfh, '>', $rfn or die "Can't write open 'rlfn': $OS_ERROR";
while (my $line = <$bfh>) {
    if ($line =~ /\*{3}/) {
        my $rpl = <$lfh>;
        $rpl = substr($rpl, 0, 3);
        $line =~ s/\*{3}/$rpl/;
    }
    print $rfh $line;
}
close $rfh or die "Can't write close '$rfn': $OS_ERROR";
close $lfh or die "Can't read close '$lfn': $OS_ERROR";
close $bfh or die "Can't read close '$bfn': $OS_ERROR";

выхад:

type ..\data\AA-result
whatever
whatever
001 Hosting Services
whatever
whatever
whatever
002 Hosting Services
whatever
whatever
003 Hosting Services
whatever
whatever
whatever
004 Hosting Services

Калі гэта не «працы» для вас (магчыма, я няправільна адгадаў Структуры У або стратэгіі F занадта наіўнай), а затым апублікаваць рэпрэзентатыўную выбарку B, L і R.

1
дададзена

<�Моцны> Ідэя:

loop over the lines of the B(ackup file)
  if you (F)ind a B-line to change
     read the next line of the L(ist file)
     change
  print the line to R(result file)

<�Моцны> План:

read_open B
read_open L
write_open R
while (line from B)
  if (F) {
    read replacemment from L
    change line
  }
  print line to R
}
close R, L, B

<�Моцны> Рэалізацыя I (read_open, пятля, глядзець на B):

use strict;
use warnings;
use English qw(-no_match_vars);

my $bfn = '../data/AA-backup-xml';
open my $bfh, '<', $bfn or die "Can't read open '$bfn': $OS_ERROR";
while (my $line = <$bfh>) {
        print $line;
}
close $bfh or die "Can't read close '$bfn': $OS_ERROR";

выхад:

perl 01.pl
whatever
whatever
*** Hosting Services
whatever
whatever
whatever
*** Hosting Services
whatever
whatever
*** Hosting Services
whatever
whatever
whatever
*** Hosting Services

<�Моцны> Рэалізацыя II (чытанне/запіс, F, замяніць, першы вынік):

use Modern::Perl;
use English qw(-no_match_vars);

my $bfn = '../data/AA-backup-xml';
open my $bfh, '<', $bfn or die "Can't read open '$bfn': $OS_ERROR";
my $lfn = '../data/AA-list.txt';
open my $lfh, '<', $lfn or die "Can't read open '$lfn': $OS_ERROR";
my $rfn = '../data/AA-result';
open my $rfh, '>', $rfn or die "Can't write open 'rlfn': $OS_ERROR";
while (my $line = <$bfh>) {
    if ($line =~ /\*{3}/) {
        my $rpl = <$lfh>;
        $rpl = substr($rpl, 0, 3);
        $line =~ s/\*{3}/$rpl/;
    }
    print $rfh $line;
}
close $rfh or die "Can't write close '$rfn': $OS_ERROR";
close $lfh or die "Can't read close '$lfn': $OS_ERROR";
close $bfh or die "Can't read close '$bfn': $OS_ERROR";

выхад:

type ..\data\AA-result
whatever
whatever
001 Hosting Services
whatever
whatever
whatever
002 Hosting Services
whatever
whatever
003 Hosting Services
whatever
whatever
whatever
004 Hosting Services

Калі гэта не «працы» для вас (магчыма, я няправільна адгадаў Структуры У або стратэгіі F занадта наіўнай), а затым апублікаваць рэпрэзентатыўную выбарку B, L і R.

1
дададзена

Вы можаце выкарыстоўваць Tie :: Файл глядзець/змяняць файлы праз прадстаўленне іх у выглядзе масіваў, а менавіта:

use strict; 
use warnings;
use Tie::File;

tie my @ra1, 'Tie::File', "test.txt" or die; #*** Hosting Services
tie my @ra2, 'Tie::File', "test1.txt" or die; #stuff you want to replace *** with

#assumes equal length
for (my $i=0; $i <= $#ra1; $i++)
{
    my $temp=$ra2[$i];
    $ra1[$i]=~s/(\*{3})/$temp/; 
}

untie @ra1;
untie @ra2;

Прыведзены вышэй код замяняе *** з адпаведнай радку спісу файла. Пры напісанні $ RA1 [$ я] = ~ s/(\ * {3})/$ TEMP/ мы непасрэдна змяняючы файл @ RA1 прывязаны да.

0
дададзена
Файлы не аднаго і таго ж памеру, а затым.
дададзена аўтар Steve P., крыніца
Калі выказаць здагадку, што ёсць тэкст у кожнай радку і файлы маюць аднолькавую колькасць радкоў, я не магу зразумець, чаму гэта не будзе працаваць.
дададзена аўтар Steve P., крыніца
Гэты метад будзе працаваць толькі ў тым выпадку, калі файлы, як апісана вышэй. Ці існуюць аднолькавыя запісы ў абодвух файлах, але адзін толькі больш? Калі гэта так, то вы можаце змяніць вышэй з дапамогай функцыі пошуку для $ Тэмп з некаторай запісу, незалежна будзе замяняе *** , і прызначаючы, што $ RA1 [ $ я] .
дададзена аўтар Steve P., крыніца
Гэта перайменавана каля 15 з асобнікаў *** , але затым пачаў паказваць памылку Выкарыстанне неинициализированного значэнне $ Тэмп ў замяшчэнні (s ///) на rename.bat лініі 12, $ ФХ > радок 56737. і проста дадаў прабел, дзе *** было для ўсіх астатніх.
дададзена аўтар user2410854, крыніца
Файл list.txt даўжынёй роўна 766 радкоў. Файл backup.xml паказвае *** роўна 766 разоў. Тым не менш, backup.xml мае ў агульнай складанасці больш за 28000 радкоў.
дададзена аўтар user2410854, крыніца
Я думаў, што вы казалі аб *** згадваецца такое ж колькасць часу, як лініі я маю на list.txt Файл backup.xml больш - каля 28 000 радкоў.
дададзена аўтар user2410854, крыніца

Вы можаце выкарыстоўваць Tie :: Файл глядзець/змяняць файлы праз прадстаўленне іх у выглядзе масіваў, а менавіта:

use strict; 
use warnings;
use Tie::File;

tie my @ra1, 'Tie::File', "test.txt" or die; #*** Hosting Services
tie my @ra2, 'Tie::File', "test1.txt" or die; #stuff you want to replace *** with

#assumes equal length
for (my $i=0; $i <= $#ra1; $i++)
{
    my $temp=$ra2[$i];
    $ra1[$i]=~s/(\*{3})/$temp/; 
}

untie @ra1;
untie @ra2;

Прыведзены вышэй код замяняе *** з адпаведнай радку спісу файла. Пры напісанні $ RA1 [$ я] = ~ s/(\ * {3})/$ TEMP/ мы непасрэдна змяняючы файл @ RA1 прывязаны да.

0
дададзена
Файлы не аднаго і таго ж памеру, а затым.
дададзена аўтар Steve P., крыніца
Калі выказаць здагадку, што ёсць тэкст у кожнай радку і файлы маюць аднолькавую колькасць радкоў, я не магу зразумець, чаму гэта не будзе працаваць.
дададзена аўтар Steve P., крыніца
Гэты метад будзе працаваць толькі ў тым выпадку, калі файлы, як апісана вышэй. Ці існуюць аднолькавыя запісы ў абодвух файлах, але адзін толькі больш? Калі гэта так, то вы можаце змяніць вышэй з дапамогай функцыі пошуку для $ Тэмп з некаторай запісу, незалежна будзе замяняе *** , і прызначаючы, што $ RA1 [ $ я] .
дададзена аўтар Steve P., крыніца
Гэта перайменавана каля 15 з асобнікаў *** , але затым пачаў паказваць памылку Выкарыстанне неинициализированного значэнне $ Тэмп ў замяшчэнні (s ///) на rename.bat лініі 12, $ ФХ > радок 56737. і проста дадаў прабел, дзе *** было для ўсіх астатніх.
дададзена аўтар user2410854, крыніца
Файл list.txt даўжынёй роўна 766 радкоў. Файл backup.xml паказвае *** роўна 766 разоў. Тым не менш, backup.xml мае ў агульнай складанасці больш за 28000 радкоў.
дададзена аўтар user2410854, крыніца
Я думаў, што вы казалі аб *** згадваецца такое ж колькасць часу, як лініі я маю на list.txt Файл backup.xml больш - каля 28 000 радкоў.
дададзена аўтар user2410854, крыніца

Гэта даволі кароткі і салодкае ў AWK:

awk '
    NR == FNR {list[FNR]=$0; next}
    /\*\*\* Hosting Services/ {sub(/\*\*\*/, list[++count])}
    {print}
' list.txt backup.xml > new_backup.xml

a2p turns that into

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}'
    if $running_under_some_shell;
            # this emulates #! processing on NIH machines.
            # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
            # process any FOO=bar switches

$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

line: while (<>) {
    chomp;  # strip record separator
    if ($. == ($.-$FNRbase)) {
        $list{($.-$FNRbase)} = $_;
        next line;
    }
    if (/\*\*\* Hosting Services/) {
        ($s_ = '"'.($list{++$count}).'"') =~ s/&/\$&/g, s/\*\*\*/eval $s_/e;
    }
    print $_;
}
continue {
    $FNRbase = $. if eof;
}
0
дададзена

Гэта даволі кароткі і салодкае ў AWK:

awk '
    NR == FNR {list[FNR]=$0; next}
    /\*\*\* Hosting Services/ {sub(/\*\*\*/, list[++count])}
    {print}
' list.txt backup.xml > new_backup.xml

a2p turns that into

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}'
    if $running_under_some_shell;
            # this emulates #! processing on NIH machines.
            # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
            # process any FOO=bar switches

$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

line: while (<>) {
    chomp;  # strip record separator
    if ($. == ($.-$FNRbase)) {
        $list{($.-$FNRbase)} = $_;
        next line;
    }
    if (/\*\*\* Hosting Services/) {
        ($s_ = '"'.($list{++$count}).'"') =~ s/&/\$&/g, s/\*\*\*/eval $s_/e;
    }
    print $_;
}
continue {
    $FNRbase = $. if eof;
}
0
дададзена
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET /a linenum=0
(
FOR /f "delims=" %%i IN ('findstr /n "$" ^new.xml

GOTO :eof

IIUC, this should replace each "*** Hosting Services" line from backup.xml with line corresponding from list.txt *** Hosting Services, creating a new file new.xml

0
дададзена
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET /a linenum=0
(
FOR /f "delims=" %%i IN ('findstr /n "$" ^new.xml

GOTO :eof

IIUC, this should replace each "*** Hosting Services" line from backup.xml with line corresponding from list.txt *** Hosting Services, creating a new file new.xml

0
дададзена