Notepad ++ постепенно заменяет

84

Допустим, я хочу иметь 10 строк данных, но хочу, чтобы значение увеличивалось для каждой строки или фрагмента данных. Как мне увеличить это значение?

Например .... Если у меня есть эти строки, есть ли способ регулярного выражения для замены значений id на приращение?

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

--- Вот как я хотел бы, чтобы это выглядело ... (если идентификатор первой строки поднимается на единицу, все в порядке)

<row id="1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5" />
Travyguy9
источник
Замены Notepad ++ не выполняют математику, как и регулярные выражения.
Эмбер,
Если возможно, это невероятно сложно. В регулярных выражениях нет понятия чисел (поэтому нет +1), и нет простого способа накапливать данные, когда вы сопоставляете регулярное выражение (поэтому нет «следующего» совпадения). XSLT может вам здесь помочь, если вам действительно нужно это автоматизировать.
@Amber Notepad ++ имеет ограниченную функциональность регулярных выражений.
Karolis
@Karolis Я это прекрасно знаю. Я просто сказал, что ни регулярное выражение (изначально), ни реализация поиска и замены в Notepad ++ с использованием этого регулярного выражения не поддерживают математику для замен.
Эмбер
1
Хотя регулярное выражение было упомянуто (и помечено) как возможный метод, OP казался менее озабоченным конкретным методом, чем просто знанием того, может ли Notepad ++ выполнить задачу ... который ответ voithos решает идеально.
jbobbins

Ответы:

157

Не уверен в регулярном выражении, но есть способ сделать это в Notepad ++, хотя он не очень гибкий.

В приведенном вами примере, удерживайте Altи выберите столбец чисел, который вы хотите изменить. Затем перейдите к Edit->Column Editorи выберите Number to Insertпереключатель в появившемся окне. Затем укажите начальное число и приращение и нажмите ОК. Он должен выписать увеличенные числа.

Примечание: это также работает с Multi-editingфункцией (выбор нескольких мест с удержанием Ctrlклавиши нажатой).

Однако это далеко не та гибкость, которую большинство людей сочло бы полезной. Notepad ++ великолепен, но если вам нужен действительно мощный редактор, который может с легкостью делать подобные вещи, я бы сказал, используйте Vim.

Войтос
источник
4
+1 как за функцию скрытых столбцов, так и за то, что vim - более мощный редактор. ;)
Spencer Rathbun
Notepad ++ - это круто, было бы здорово, если бы у нас был такой же мощный онлайн-редактор, как этот.
Луис Фейджао Веронези
1
Для меня это было: выберите столбец с помощью Alt + Shift, а затем введите номер для вставки. Работает отлично
Rombus
Благодаря! Это отличная функция. Кроме того, я смог выбрать столбец, дважды щелкнув его.
Рахим Ходжа
Просто восхитительно! Просто спас мне жизнь, когда мне пришлось подготовить 300 вставляющих операторов,
DoNuT 02
14

Сегодня я искал ту же функцию, но не смог этого сделать в Notepad ++. Однако нам на помощь приходит TextPad. У меня это сработало.

В диалоговом окне замены TextPad включите регулярное выражение; тогда вы можете попробовать заменить

<row id="1"/>

по

<row id="\i"/>

Взгляните на эту ссылку для получения дополнительных замечательных функций замены TextPad - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/

Бипин Мангвани
источник
1
Думаю, это помогает, если я действительно обращаю внимание. Закончил установку SublimeText. :) Благодаря.
RTF
1
Но убедитесь, что вы нажали кнопку «Заменить все». «Заменить далее» не увеличивает счетчик. Чтобы понять это, потребовались часы. \ i Заменить числами, начинающимися с 1, с увеличением на 1. \ i (10) Заменить числами, начиная с 10, с увеличением на 1. \ i (0,10) Заменить числами, начиная с 0, с увеличением на 10. \ i ( 100, -10) Замените числами, начиная со 100, с уменьшением на -10.
Венкатеш Муниянди
8

У меня была такая же проблема с более чем 250 строками, и вот как я это сделал:

например :

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

вы помещаете курсор сразу после «1», и вы нажимаете alt + shiftи начинаете спускаться со стрелкой вниз, пока не дойдете до нижней строки, теперь вы видите группу выборов, нажмите стереть, чтобы стереть цифру 1 в каждой строке одновременно, и перейдите к Edit -> Column Editorи выберите Number to Insertзатем введите 1начальное числовое поле и1 увеличьте его на поле, отметьте нулевые числа и нажмитеok

Поздравляю, вы сделали это :)

Мурад Эль Аомари
источник
5

Поскольку реальных ответов ограничено, я поделюсь этим обходным путем. На самом деле простых случаев, таких как ваш пример, вы делаете это в обратном порядке ...

Из этого

1
2
3
4
5

Замените \r\nна, " />\r\n<row id="и вы получите 90% пути

1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5

Или аналогичным образом вы можете взломать данные с помощью Excel / электронной таблицы. Просто разделите исходные данные на столбцы и изменяйте значения по своему усмотрению.

|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |

Это очевидный материал, но он может помочь кому-то, выполняющему разовый разовый взлом, сэкономить несколько нажатий клавиш.

KCD
источник
5
замена (.*)на <row id="\1" />в режиме регулярного выражения без . matches newlineдаст вам 100% пути туда.
satibel
4

http://docs.notepad-plus-plus.org/index.php/Inserting_Variable_Text

Notepad ++ оснащен редактором Edit -> Column «Alt + C», который может работать с прямоугольным выделением двумя разными способами: Coledit.png вставка фиксированного текста в каждую строку, включая и после текущей строки, в столбце вставки точка (также известная как каретка). Первоначально выделенный текст остается нетронутым. Как показано на рисунке, таким же образом можно вставить линейный ряд чисел. Необходимо указать начальное значение и приращение. Левое заполнение нулями - это вариант, и число может быть введено с основанием 2, 8, 10 или 16 - так будут отображаться вычисленные значения, причем заполнение основано на самом большом.

Эйлсон Коста
источник
Будет намного лучше, если вы приложите изображение к сообщению, чтобы избежать путаницы при чтении вашего ответа
Амина Нураини
1

(Публикация на случай, если кому-то это пригодится).

Я искал решение проблемы немного более сложного, чем OP - замена КАЖДОГО вхождения чего-либо с числом на то же самое с увеличенным числом

Например, заменив что-то вроде этого:

<row id="1" />
<row id="2" />
<row id="1" />
<row id="3" />
<row id="1" />

Этим:

<row id="2" />
<row id="3" />
<row id="2" />
<row id="4" />
<row id="2" />

Не удалось найти решение в Интернете, поэтому я написал свой собственный сценарий на Groovy (немного некрасиво, но выполняет свою работу):

 /**
 * <p> Finds words that matches template and increases them by 1.
 * '_' in word template represents number.
 *
 * <p> E.g. if template equals 'Row="_"', then:
 * ALL Row=0 will be replaced by Row="1"
 * All Row=1 will be replaced by Row="2"
 * <p> Warning - your find template might not work properly if _ is the last character of it
 * etc.
 * <p> Requirments:
 * - Original text does not contain tepmlate string
 * - Only numbers in non-disrupted sequence are incremented and replaced
 * (i.e. from example below, if Row=4 exists in original text, but Row=3 not, than Row=4 will NOT be 
 * replaced by Row=5)
 */
def replace_inc(String text, int startingIndex, String findTemplate) {
    assert findTemplate.contains('_') : 'search template needs to contain "_" placeholder'
    assert !(findTemplate.replaceFirst('_','').contains('_')) : 'only one "_" placeholder is allowed'
    assert !text.contains('_____') : 'input text should not contain "______" (5 underscores)'
    while (true) {
        findString = findTemplate.replace("_",(startingIndex).toString())
        if (!text.contains(findString)) break;
        replaceString = findTemplate.replace("_", "_____"+(++startingIndex).toString())
        text = text.replaceAll(findString, replaceString)
    }
    return text.replaceAll("_____","") // get rid of '_____' character
}

// input
findTemplate = 'Row="_"'
path = /C:\TEMP\working_copy.txt/
startingIndex = 0

// do stuff
f = new File(path)
outText = replace_inc(f.text,startingIndex,findTemplate)
println "Results \n: " + outText
f.withWriter { out -> out.println outText }
println "Results written to $f"
Кранах
источник
1

Вы можете сделать это с помощью Powershell через регулярное выражение и цикл foreach, если вы сохраните свои значения в файле input.txt :

$initialNum=1; $increment=1; $tmp = Get-Content input.txt | foreach {  $n = [regex]::match($_,'id="(\d+)"').groups[1
].value; if ($n) {$_ -replace "$n", ([int32]$initialNum+$increment); $increment=$increment+1;} else {$_}; }

После этого вы можете сохранить $ tmp в файле, используя $tmp > result.txt. При этом данные не обязательно должны быть в столбцах.

Иван Г
источник