Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Как заменить части строки по списку?

Ответить
Настройки темы
VBS/WSH/JS - Как заменить части строки по списку?

Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


Имеется код, осуществляющий двойную замену в файле (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 при этом остаются фиксированными)?

Отправлено: 13:19, 21-03-2018

 

Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Цитата ruslaw:
Как сделать так чтобы можно было не перечислять паттерны замены в скрипте
Если не усложнять себе жизнь, проще вообще взять sed и не парить мозг.
Код: Выделить весь код
E:\sandbox> echo abc123 abc789 | sed y/abc/xyz/
xyz123 xyz789
То же применимо и к файлам. Кстати, примеры файлов где?

Отправлено: 17:07, 21-03-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:32, 21-03-2018 | #3


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Цитата 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

Отправлено: 08:40, 22-03-2018 | #4


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


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 }
скрыв таким образом все что было в прошлом году и уже прочтено
Все упирается в список.

Отправлено: 13:44, 22-03-2018 | #5


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


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?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 22-03-2018 в 15:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:36, 22-03-2018 | #6


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:27, 22-03-2018 | #7


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: xls я180322.xls
(34.5 Kb, 2 просмотров)

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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:54, 22-03-2018 | #8


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:13, 23-03-2018 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Как заменить части строки по списку?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Поиск строки и использование её части Ewgenyk Скриптовые языки администрирования Windows 0 06-12-2017 14:36
VBS/WSH/JS - [решено] Поиск строки по части названия и вывод данных в ECHO Kainos Скриптовые языки администрирования Windows 14 16-04-2015 22:21
CMD/BAT - [решено] удаление части строки nvitek Скриптовые языки администрирования Windows 18 27-08-2014 17:32
VBS/WSH/JS - [решено] Парсинг части строки с разделителями Kosmoman Скриптовые языки администрирования Windows 4 22-05-2014 13:31
CMD/BAT - Заменить строки в бат файле Gala.qwer Скриптовые языки администрирования Windows 1 11-08-2011 19:16




 
Переход