2016-08-19 6 views
2

Интересно, может ли кто-нибудь помочь.Найти и заменить в нескольких текстовых файлах в папке

У меня есть большое количество текстовых файлов, которые имеют один и тот же тип информации. Ниже приведены два примера, все файлы содержат 4 строки:

no: 734 
word=achieving 
def: 
LinkToAnother=achieving 

no: 657 
word=accumulating 
def: 
LinkToAnother=accumulating 

Original state of the text within the files

Как использовать Поиск & Заменить (с помощью Regex) в нескольких файлах с использованием Sublime или в качестве альтернативы пакетного файла сценарий дос? Он должен заменить последние три буквы четвертой строки (ing) с письмом (e) и, следовательно, достичь следующего:

no: 734 
word=achieving 
def: 
LinkToAnother=achieve 

no: 657 
word=accumulating 
def: 
LinkToAnother=accumulate 

The outcome of the text within the files

Я с головной болью, пытаясь понять, как только выберите второй экземпляр символов, которые я хочу в текстовом файле. Очень благодарен за любую помощь здесь.

ответ

0

Попробуйте это:

@echo off 
setlocal EnableDelayedExpansion 

for %%a in (*.txt) do (
    (for /L %%i in (1,1,4) do set /P "line[%%i]=") < "%%a" 
    (for /L %%i in (1,1,3) do echo !line[%%i]! 
    echo !line[4]:~0,-3!e) > "%%a" 
) 

То есть: «заменить последние три буквы четвертой строки с буквой (е)».

Если эта душа слишком медленная, есть несколько модификаций, которые могут помочь ускорить ее.

+0

Hi Aacini, спасибо лет u, это работает. Но как это можно адаптировать, чтобы он выполнял задачу только на тех строках, которые заканчиваются конкретными тремя последними символами («ing»), а не тремя последними символами. Поэтому я могу адаптировать его для других сценариев. –

0

Если вы устанавливаете СЭД через MSYS или WINSED вы можете сделать следующее

sed -b -i -e "4s/ing\(\s*\)$/e\1/" 

Он открывает все *.txt файлов (текущий каталог) и редактирует 4-ю строку, чтобы заменить файлы, оканчивающиеся ing и изменения в e.

Возврат каретки (\r).

0

Так вы спрашивали, как сделать это в Sublime Text, следующий RegEx шаблон работает для меня в диалоге поиска:

Поиск:^((?:word|LinkToAnother).*)(ing)$

Заменить:$1

Если вы хотите игнорировать ключевые имена, вместо этого используйте ^(.*)(ing)$.

Разбивка:

  • ^ - начало строки или начало строки в многострочном шаблоне
  • первой группы записи (будет $1):
    • (?:...) - Passive (не с захватом) для word или LinkToAnother
    • .* - 0 или более любых символов (кроме новой строки)
  • (ing) - второй захват группы для ing (будет $2)
  • $ - Конец строки или конец строки в многострочного шаблон

Поскольку мы только после первого захвата группы, $1 помещается в Заменить поле

+0

Ничего себе, спасибо, idleberg, это работает, какая книга или страница сайта научили меня этому уровню regx? Не могли бы вы объяснить это более подробно о том, что здесь происходит? –

+0

Я всегда возвращаюсь к [RegEx Cheat Sheet] (https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/), и я тестирую свои шаблоны на таких сайтах, как [RegExr] (http : //regexr.com/). Кстати, пожалуйста, примите ответ, если он поможет решить вашу проблему! – idleberg

Смежные вопросы