Как я могу выполнить большое количество различных операций поиска / замены?

444
ete

У меня несколько раз был текстовый документ, к которому мне нужно применить несколько сотен операций поиска / замены. Эти находки / замены не следуют шаблону, к которому может быть применено регулярное выражение, и должны применяться по порядку. Ранее после долгих поисков я прибегал к их выполнению вручную, но есть ли лучший способ?

0

3 ответа на вопрос

1
Nicole Hamilton

Please correct me if I've misunderstood your question but from your description, I take it to mean you have a single (possibly very large) Ascii .txt document and that when you say the changes must be applied "in order", you mean you'd like to do the first search/replace on the entire document, then the second search/replace on the entire document and so on.

Perhaps the easiest solution would be to create file (call it sedscript) containing a sed script, one line per change. Here's an example. The g at the end means "global", i.e., replace all occurrences, not just the first occurrence on any given line.

s/foo/bar/g s/hello/world/g s/yellow/green/g : 

You could then run this as follows:

sed -f sedscript infile.txt > outfile.txt 

If you're satisfied with the output, simply mv it back over the top of the input:

mv outfile.txt infile.txt 

If you're on a Linux machine, that comes with sed. If you're on Windows, you can get sed (and mv) with either Cygwin or my own Hamilton C shell (including the free version).

Added:

Since you would also like to consider matches that span line ends, then, yes, one way to do that is to replace all the line ends with a special character or string, do the search/replace operations you intend, then put the line ends back when you're done.

The easiest way to do the line end conversions with sed is in separate pipeline stages. In my example here, I've replaced the \r\n sequences with a # but could be a completely arbitrary string (but it's easier if you can use a single character.)

sed 's/\r\n/#/' infile.txt | s -f sedscript | sed 's/#/\r\n/g' > outfile.txt 

Inside your sedscript file, you'd then search/replace on both variations, with a space between the words or whatever you've replaced it with.

If you're able to use just a single character and don't need a multicharacter string to guarantee uniqueness, you can use \(...\) notation to create a tagged regular expression around [...] list of characters that might separate a word. Whatever it matches can be inserted into the replace string as \1.

Here's a screenshot how this might work.

Line breaks with sed

Вы правильно поняли. Будет ли это работать с символами табуляции и новой строки как часть поиска / замены? И я довольно плохо знаком с / неудобен с командной строкой, так что было бы еще лучше, если бы вы давали точные команды для использования, если файл, на котором я хочу выполнить замену, находится в C: \ Users \ Eric \ Documents \ unformatted .текст ete 11 лет назад 0
Он будет работать с символами табуляции в строке поиска или замены, но не с символами новой строки. (Требуется ли сопоставление строк со встроенными символами новой строки?) Замените `infile.txt` на ваш фактический путь,` C: \ Users \ Eric \ Documents \ unformatted.txt`. Nicole Hamilton 11 лет назад 0
Хорошо, замена новых строк необходима для многих операций поиска / замены, но я мог бы обойти это с помощью http://www.textfixer.com/tools/remove-line-breaks.php, если я могу добавить новые строки с помощью найти / заменить, есть ли способ сделать это? И спасибо. ete 11 лет назад 0
Есть ли новые строки просто для переноса текста на удобные поля или потому, что каждая строка является отдельной записью? Nicole Hamilton 11 лет назад 0
Новые строки, которые будут удалены, являются частью форматирования, которое я хочу удалить, я не уверен, к чему это относится. ete 11 лет назад 0
Я пытаюсь спросить, может ли разрыв строки произойти где-либо между словами в строке поиска. Например, если вы искали все вхождения «сейчас самое время», нужно ли вам рассматривать возможность разрывов строк где-либо между словами во фразе и сопоставлять все возможности? Мне интересно, можно ли было бы получить случаи, когда фаза была нарушена, просто выполнив поиск двух половин или просто заменив все новые строки на пробелы, выполнив поиск, заменив, а затем просто перевернув текст. Я не знаю достаточно о том, как выглядят ваши фактические данные. Nicole Hamilton 11 лет назад 0
Разрывы строк помещаются между непротиворечивыми словами, поэтому замена всех разрывов строк строкой-заполнителем, затем выполнение поиска / замены (удаление некоторых строк-заполнителей), а затем замена строки-заполнителя символом новой строки будет работать нормально. Можно ли заменить все новые строки на заполнитель, используя это? Кроме того, принимая, поскольку вы уже полностью ответили на мой первоначальный вопрос, я должен был упомянуть разрывы строк. ete 11 лет назад 0
@ete Я обновил свой ответ, чтобы рассмотреть новые строки. Nicole Hamilton 11 лет назад 0
0
Gruber

Normally programs are good at applying a single search-and-replace combination to multiple files, not the other way around.

To me it seems like your best bet is using a word processor program with macro capabilities. Then you can write a function which performs the replacing, and then call it hundred of times with your search/replace strings. Macro-enabled word processors are, for example LibreOffice Writer and Microsoft Word.

Это кажется разумным подходом: в Notepad ++ (мой обычный текстовый редактор), похоже, есть функции, но я не уверен, как заставить его правильно заменять символы новой строки (расширенный режим позволяет заменять вещи с помощью новой строки нормально, но не заменяет новые строки) , ete 11 лет назад 0
0
Karan

FART должен быть в состоянии помочь вам. Просто создайте пакетный файл с несколькими вызовами FART, и, если вы хотите заменить newlines (\r\n), включите использование синтаксиса в стиле C черезпараметры-Cили--c-style.