Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / [скорее всего perl] Как закоментировать блок текста с вложенными скобками? / 13 сообщений из 13, страница 1 из 1
21.11.2008, 17:01:32
    #35668775
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
в тексте нужно найти и закомментировать кусок текста такого вида :

Код: plaintext
1.
2.
3.
4.
someHeader {
...
...
..
}


Внутри {...} может встречаться любое количество {..}. Скобки могут быть вложенными . Нужно закомментить их все от первой открывающей до соответствующей закрывающей скобки.
sed'ом такое навряд ли получится.




--
У мудрого человека нет врагов - только учителя
...
Рейтинг: 0 / 0
21.11.2008, 19:37:15
    #35669054
fy
fy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
makondo,

Так прокатит?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
[root@test root]# cat tst.sed
qwerty
qwerty {}
test {
{qwe {}
qwe} {dsad}
qwe {
qwe}
}
qwe123
test {
{}
}
[root@test root]# sed "/^test.*$/,/^\}/{s/\(.*\)/#\1/g}" tst.sed
qwerty
qwerty {}
#test {
#{qwe {}
#qwe} {dsad}
#qwe {
#qwe}
#}
qwe123
#test {
#{}
#}
...
Рейтинг: 0 / 0
21.11.2008, 20:04:57
    #35669092
avb1003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
fy,

macondo это может быть и пoдойдет, если у него файлов типа:
tst1.dat[FIXIED]qwerty
qwerty {}
test {
{qwe {}
qwe} {dsad}
qwe {
qwe
}
}
qwe123
test {
{}
}
или
tst2.dat
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
qwerty
qwerty {}
test {
{qwe {}
qwe} {dsad}
qwe {
qwe}
    }
qwe123
test {
{}
}
...
Рейтинг: 0 / 0
21.11.2008, 20:33:23
    #35669120
fy
fy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
avb1003,

Это было предложено как вариант. И если Вы, уважаемый, не смогли включить мозг и применить подобный механизм к файлам с другим содержанием, то я Вам сочувствую. Удачи.
...
Рейтинг: 0 / 0
21.11.2008, 20:46:26
    #35669134
avb1003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
fyavb1003,

Это было предложено как вариант. И если Вы, уважаемый, не смогли включить мозг и применить подобный механизм к файлам с другим содержанием, то я Вам сочувствую. Удачи.
В том то и дело, что я как раз то смог. И предложил Вам. Но я не предполагал, что это Вам
так трудно. Извините.
...
Рейтинг: 0 / 0
21.11.2008, 20:54:07
    #35669140
fy
fy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
avb1003,

Если не трудно, продемонстрируйте свой вариант для решения подобных задач.
...
Рейтинг: 0 / 0
22.11.2008, 08:53:04
    #35669404
avb1003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
fyavb1003,

Если не трудно, продемонстрируйте свой вариант для решения подобных задач.
У меня нет "своего варианта для решения подобных задач".Каждая из подобных задач решалась мной по-мере
появления адекватно конкретной ситуации, в зависимости от конкретных обстоятельств:
объема исходных файлов, важности 100%-ой правильности решения, финансовой мотивированности
и т.д. В каких-то ситуациях правил "руками" - в нормальном редакторе это нетрудно,
в каких-то использовался вариант типа вашего.
Главный недостаток Вашего "варианта" в контексте данного форума- отсутствие указания условий его применимости, и как следствие, опасность, что какой-нибудь HR-гуру посчитает эту задачу,
адекватной для собеседования, так как у нее есть "простое решение в одну строку".
Что касается возможности решения с помощью регулярных выражений, то я склонен верить Фридлу:
"... Итак, ни один из предложенных вариантов не работает. В сущности, проблема в том, что находить конструкции произвольной вложености при помощи регулярных выражений не удается.Это попросту невозможно..." ( Дж.Фридл. "Регулярные выражения. Библиотека программиста" СПб.:Питер, 2001. c.147)
Когда же мне, примерно три года назад, нужно было "разбираться" с блоками C-ной программы, то делал "честно":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
@chars=split //,$string;
LOOP:
for $i ( 0 ..$#chars) {
    $chr=$chars[$i];
...
            if($chr eq '{') {
                $level++;
                push @out_curly_bracket,[$level,$source_line_number,$i];
            }
            if($chr eq '}') {
                local $x=pop @out_curly_bracket;
                die "non matching bracket error!\n" unless $x;
                push @all_blocks,[$x->[ 0 ],$x->[ 1 ],$x->[ 2 ],
                        $source_line_number,$i];
                $level--;
            }
...
}

Это был узкоспециализированный скрипт для одноразового использования объемом порядка 1000
строк, не подходящий для публичной демонстрации. Подозреваю(почти уверен), что задачу топикстартера можно решить скриптом для какого-нибудь VI-подобного редактора, но готового
решения у меня нет, равно как и желания сейчас им заниматься. Но если у меня вдруг появится
желание и получится "хорошее" решение, то я его приведу, наверное. Если этого не сделает кто-то другой.
...
Рейтинг: 0 / 0
22.11.2008, 12:55:36
    #35669520
fy
fy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
avb1003,

Я Вас понял, спасибо за развернутый ответ.
...
Рейтинг: 0 / 0
24.11.2008, 14:07:24
    #35671661
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
[quote]"... Итак, ни один из предложенных вариантов не работает. В сущности, проблема в том, что находить конструкции произвольной вложености при помощи регулярных выражений не удается.Это попросту невозможно..." ( Дж.Фридл. "Регулярные выражения. Библиотека программиста" СПб.:Питер, 2001. c.147)[/quote]


Это ужасно! Мир перевернулся... ((
Придется на перле писать

Спасибо за ваш sed-скрипт, но почему-то он у меня не работает:

Код: plaintext
1.
2.
 1 / 4420  % cat test.txt|  sed "/^test.*$/,/^\}/{s/\(.*\)/#\1/g}"
sed: command garbled: /^test.*$/,/^\}/{s/\(.*\)/#\ 1 /g}

Видимо, мой sed совсем базовый и не понимает, вы скорее всего GNU-шным пользовались
...
Рейтинг: 0 / 0
24.11.2008, 16:33:17
    #35672129
fy
fy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
makondo,
авторпочему-то он у меня не работает

попробуйте переписать так:
Код: plaintext
1.
'/^test.*$/,/^}/s/\(.*\)/#\1/g'

Хотя лучше конечно же написать полноценный скрипт=)
...
Рейтинг: 0 / 0
24.11.2008, 16:44:31
    #35672173
makondo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
fymakondo,
авторпочему-то он у меня не работает

попробуйте переписать так:
Код: plaintext
1.
'/^test.*$/,/^}/s/\(.*\)/#\1/g'

Хотя лучше конечно же написать полноценный скрипт=)

Спасибо! Теперь работает. Признаюсь честно, я непонял, как это работает ... )
Можете прокомментировать?

Замену s/\(.*\)/#\1/g я понимаю.
но что в ней матчится как \(.*\) ?

Объясните, плз, первую часть. Хоть убейте не пойму, как он матчит вложенные скобки
...
Рейтинг: 0 / 0
24.11.2008, 17:09:29
    #35672274
fy
fy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
makondo,

Вложенные скобки определяются как набор символов ".*" (то есть строка состоящая из любого ко-ва любых символов), где их впоследствии и используем как "\1". Слешы пере скобками собственно и нужны для экранирования, так как без них был бы просто набор "(.*)" (то есть со скобками).

Примерчик:
Код: plaintext
1.
2.
3.
4.
#cat test
 111    aaa
#sed 's/^\([0-9]*\)\(.*\)\([a-z]*\)$/\3\2\1/g' test
aaa    111 
...
Рейтинг: 0 / 0
24.11.2008, 19:06:54
    #35672594
avb1003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[скорее всего perl] Как закоментировать блок текста с вложенными скобками?
makondo,
makondo
...
Объясните, плз, первую часть. Хоть убейте не пойму, как он матчит вложенные скобки
А он и не "матчит".
Код: plaintext
1.
/^test.*$/,/^}/
Ищет диапазон, начинающийся со cтроки, в которой с самого начала стоит слово "test",
и кончающийся строкой, первым символом которой стоит символ закрывающей фигурной
скобки.
Код: plaintext
1.
s/\(.*\)/#\ 1 /g
- Здесь же вычурным способом в начале, каждой строки диапазона ставится символ '#'.
Проще было бы:
Код: plaintext
1.
s/^/#/g
Предложенный fy "вариант" будет работать только "для правильно отформатированных" файлов.
Прочитайте мой первый пост.
makondo
...
Это ужасно! Мир перевернулся... ((
Придется на перле писать
...

Ничего страшного. Другие же пишут.
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / [скорее всего perl] Как закоментировать блок текста с вложенными скобками? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]