Regex, чтобы добавить дополнительные строки текста между некоторыми строками? - PullRequest
0 голосов
/ 15 октября 2010

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

Скажите, у меня есть следующий текст:

a
aa
aaa
aaaa
aaaa
aaaaa
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaa
a

То, что я хотел бы сделать, это, К примеру, когда за строкой 4 а следует строка 1 а. Я хотел бы добавить строку 3 a после строки 4 и добавить строку 2 a после строки 3. Таким образом, результат будет следующим:

a
aa
aaa
aaaa
aaaa
aaaaa
aaaa
aaa
aa
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaa
aaaa
aaa
aa
a

Я попробовал следующее регулярное выражение в editpad pro:

find: \r?\n(a*)aa\r?\n\1\r?\n
repl: \n\1aa\n\1a\n\1\n

Но это работает только тогда, когда в следующей строке ровно на 2 а меньше, чем в предыдущей. Я знаю, что мог бы написать несколько регулярных выражений, таких как приведенные выше, для работы с разницей в 2 а, 3 а, 4 а 5 а и так далее. Но я бы хотел иметь только одно регулярное выражение. Я не против, если бы мне пришлось запускать это регулярное выражение несколько раз, хотя ..

Ответы [ 2 ]

0 голосов
/ 16 октября 2010

Если вы сохраняете фиктивные данные в файле с именем file, сохраните следующую программу gawk (1) в файле с именем runme и вызовите ее из оболочки как gawk -f runme file, она должен привести к желаемому результату.

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

BEGIN { }

{
    if (NR==1) { print $0; oldrec = $0; }

    if (NR>1) {
            levelsdiff = length(oldrec) - length($0);

            if (levelsdiff>1) { 
                    newrecs = levelsdiff - 1;
                    i = 1;
                    while (newrecs>0) {
                            newline = "";
                            hashes = length(oldrec) - i;
                            while (hashes!=0) {
                                    newline = newline "#";
                                    hashes--;
                            }
                            print newline;
                            i++; newrecs--;
                    }
            }

            if (levelsdiff<1) { 
                    newrecs = -levelsdiff - 1;
                    i = 1;
                    while (newrecs>0) {
                            newline = "";
                            hashes = length(oldrec) + i;
                            while (hashes!=0) {
                                    newline = newline "#";
                                    hashes--;
                            }
                            print newline;
                            i++; newrecs--;
                    }
            }

            print $0;
            oldrec = $0;
    }
}

END { }

Выходы:

a
aa
aaa
aaaa
aaaa
aaaaa
####
###
##
a
aa
aaa
aaaa
aaaaa
aaaaaa
#####
aaaa
###
##
a
0 голосов
/ 15 октября 2010

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

find: (a*)aa\r?\n\1\r?\n
repl: \1aa\n\1a\n\1\n

Это работает после того, как я несколько раз щелкну «заменить все» в editpad pro. Я хотел бы найти решение, в котором мне нужно выполнить замену всего один раз, так что если есть какие-то дальнейшие мысли, пожалуйста, дайте мне знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...