![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 28.10.2016
Сообщений: 2
|
![]()
Задание: Сценарий заменяет в тексте программы на Pascal, подаваемой на стандартный ввод, все комментарии типа "(* comment *)" на комментарии типа "{comment}" (с учетом многострочных комментариев). Результат выдается на стандартный вывод.
Пример: $ cat myprog.pas program example; begin (* aaaa *) end. $ ./myscript.sh <myprog.pas program example; begin {aaaa} end. Я написала это следующим образом: #!/bin/bash grep '(* *)' *.pas|while read line; do; echo $line "(* *)"|tr '{* *}'; done Но не работает, подскажите пожалуйста, что не так. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
![]()
У grep несколько специфические выражения регулярок, хотя в вашем случае - всё прозаичнее:
* - одно или несколько вхождений предыдущего символа. Если вы хотите искать саму * её надо экранировать \* () - это спецсимволы группировки, их тоже надо экранировать как \( \) Попробуйте: grep -E '\(\*.*\*\)' *.pas Я не знаю что там у grep с "жадностью" поиска, потому, что "жадный" поиск отловит всю строку от первой (* и до последней *) если их там несколько: (* привет *) ещё одно вхождение *) и наконец *) В обычных регулярках "жадность" отменяется по ? grep -E '\(\*.*?\*\)' .*? - любое количество (ибо *) любых символов (ибо .) а ? - вернуть самую короткую строку попавшую под шаблон. Ключ -Е - расширенный синтаксис регулярных выражений, без него кое-что не будет работать, например, группирующие скобки () И регулярка grep -E '\(\*.*\*\)' *.pas только найдёт и распечатает строки с комментариями. Далее вам надо сделать замену их на {comment}. PS: У вас - многострочные комментарии, поэтому читать построчно - не правильно. По-моему, grep читает файл только построчно, так что придётся "выкрутасничать"для многострочных комментариев. Вам точно с помощью grep надо? поскольку тут sed больше подходит - он сразу найдёт и заменит. А grep - только ищет и выводит строки, попавшие под заданный шаблон. Последний раз редактировалось predefined; 30.10.2016 в 05:40. |
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 28.10.2016
Сообщений: 2
|
![]()
Не обязательно использовать grep. Если применить sed, то так будет?
sed 's/\x22(* *)\x22\x2C/\x22{ }\x22\x2C/g' |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сценарий с крымом | western_digital | Свободное общение | 141 | 13.03.2014 08:56 |
сценарий входа | demontools | Помощь студентам | 10 | 24.12.2011 01:11 |
Написать простой сценарий на JS | elris | Фриланс | 4 | 05.10.2011 17:52 |
сценарий на php | kettyrus | Помощь студентам | 0 | 03.11.2009 11:36 |