Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как заменить части строки по списку? (http://forum.oszone.net/showthread.php?t=333878)

ruslaw 21-03-2018 13:19 2804627

Как заменить части строки по списку?
 
Имеется код, осуществляющий двойную замену в файле (abc123 на xyz123 и abc789 на xyz789 ):
Код:

var fso = new ActiveXObject("Scripting.FileSystemObject");
  var pattern1 = /abc123/g;var pattern1a = 'xyz123';
  var pattern2 = /abc789/g;var pattern2a = 'xyz789';
    var myInputTextStream = fso.OpenTextFile('C:\\test1.txt', 1, true);
    var myOutputTextStream = fso.OpenTextFile('C:\\test2.txt', 2, true);
    myOutputTextStream.Write(
      myInputTextStream
        .ReadAll()
        .replace(pattern1, pattern1a)
        .replace(pattern2, pattern2a)

    )
    myInputTextStream.Close();
    myOutputTextStream.Close();

abc и xyz - фиксированные паттерны, а 123 и 789 это нектороые числа

Как сделать так чтобы можно было не перечислять паттерны замены в скрипте, а использовать список таких чисел C:\list.txt, разумеется элементов списка будет гораздо больше двух (abc и xyz при этом остаются фиксированными)?

greg zakharov 21-03-2018 17:07 2804679

Цитата:

Цитата ruslaw
Как сделать так чтобы можно было не перечислять паттерны замены в скрипте

Если не усложнять себе жизнь, проще вообще взять sed и не парить мозг.
Код:

E:\sandbox> echo abc123 abc789 | sed y/abc/xyz/
xyz123 xyz789

То же применимо и к файлам. Кстати, примеры файлов где?

ruslaw 21-03-2018 21:32 2804734

что-то я не совсем понял как это работает
наверное штука сильная, но надо изучать
В принципе спасибо

greg zakharov 22-03-2018 08:40 2804781

Цитата:

Цитата ruslaw
что-то я не совсем понял как это работает
наверное штука сильная, но надо изучать

Изучать там особо нечего, достаточно почитать руководство (man page). А вот примеров файлов от Вас не последовало, поэтому код выше лишь показывает трансформацию того, что выводит echo в консоли. Допустим, есть файл следущего содержания:
Код:

строка 1 abc123 abc789
строка 2 abc123 abc789
строка 3 abc123 abc789
строка 4 abc123 abc789
строка 5 abc123 abc789
строка 6 xyz123 abc789
строка 7 abc123 xyz789
строка 8 xyz123 xyz789

Чтобы заменить все abc на xyz достаточно команды:
Код:

sed -i y/abc/xyz/ file.txt
В итоге файл становится:
Код:

строка 1 xyz123 xyz789
строка 2 xyz123 xyz789
строка 3 xyz123 xyz789
строка 4 xyz123 xyz789
строка 5 xyz123 xyz789
строка 6 xyz123 xyz789
строка 7 xyz123 xyz789
строка 8 xyz123 xyz789


ruslaw 22-03-2018 13:44 2804837

greg zakharov,
теперь у меня получилось вообще поиметь дело с этим sed, да, это сильная штука.
Но у меня строение файла иное,
file.txt:
Цитата:

abc123
abc456
abc789
abc101
abc678
abc876
abc321
......
и согласно list.txt:
Цитата:

456
101
321
надо получить:
Цитата:

abc123
xyz456
abc789
xyz101
abc678
abc876
xyz321
......
для megaloman:
"физика" задачи такая:
Есть страница куда регулярно добавляются книги с описаниями. Каждое такое описание заключено внутри тега <div id="div_file_123123">...</div>
У меня есть прошлогодняя версия этой страницы из которой я извлек список номеров, включенных в id (типа 123123) и я хочу по всем этим номерам сделать у текущей страницы замену
id="div_file_123123 на class=none id="div_file_123123
при этом добавить в css-стили страницы строку div.none { display: none }
скрыв таким образом все что было в прошлом году и уже прочтено
Все упирается в список.

megaloman 22-03-2018 15:36 2804855

js по мотивам приведенных Вами примеров. Пропишите свои файлы и чему соответствуют abc и xyz
Код:

var inFile='Z:\\Box_In\\test1.txt';

var abc='abc';
var xyz='xyz';

var listFile='Z:\\Box_In\\list.txt'

var outFile='Z:\\Box_In\\test2.txt';

var FSO=WScript.CreateObject("Scripting.FileSystemObject");

try {Txt=FSO.OpenTextFile(inFile, 1, false);}
catch (err) {
        if (err != 0) {
                WScript.Echo("Open file "+inFile+"\nerror: "+err.number+"\n"+err.description);
                WScript.Quit();
        }
}
var strContent = Txt.ReadAll();
Txt.Close();

try {Txt=FSO.OpenTextFile(listFile, 1, false);}
catch (err) {
        if (err != 0) {
                WScript.Echo("Open file "+listFile+"\nerror: "+err.number+"\n"+err.description);
                WScript.Quit();
        }
}
var strRepl;

while (!Txt.eof) {
        try {strRepl = Txt.ReadLine()}
        catch (e) {if (e != 0) break}
        strRepl=strRepl.replace(new RegExp(' ', 'g'), '');
        strContent=strContent.replace(new RegExp(abc+strRepl, 'g'), xyz+strRepl);
}
Txt.Close();

try {Txt=FSO.OpenTextFile(outFile, 2, true);}
catch (err) {
        if (err != 0) {
                WScript.Echo("Open file "+outFile+"\nerror: "+err.number+"\n"+err.description);
                WScript.Quit();
        }
}
Txt.Write(strContent);
Txt.Close();

Попутно предложение: почему бы вместо того, чтобы делать файл list.txt сделать xls-таблицу и обрабатывать Ваш файл макросом из-под Excel?

ruslaw 22-03-2018 16:27 2804869

megaloman,
БОЛЬШОЕ СПАСИБО, все работает!
Идея с макросом конечно интересная - если только знать VBA .... (но увыыыыы )

megaloman 22-03-2018 20:54 2804914

Вложений: 1
Цитата:

Цитата megaloman
почему бы вместо того, чтобы делать файл list.txt сделать xls-таблицу и обрабатывать Ваш файл макросом из-под Excel »


ruslaw 23-03-2018 12:13 2804982

Супер! Все сработало. Спасибо!


Время: 07:29.

Время: 07:29.
© OSzone.net 2001-