На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
  
    > SED: Исключить несколько подстрок из определенных строк , Использую SED с Perl расширением.
      Искомая строка может выглядеть двумя способами:

      echo eCMD Linker. Ver.: 1.04 (beta) [ @@@@@@@@15/@@@@@@@@06/@@@@@@@@14 @@@@@@@@16:12 ]
      или
      call :PrintOut eCMD Linker. Ver.: 1.04 (beta) [ @@@@@@@@15/@@@@@@@@06/@@@@@@@@14 @@@@@@@@16:12 ]

      Строка может начинаться с "echo" или "call :PrintOut", потом может быть какой угодно текст, но если появляется цифра, она может предваряться 8ю символами "@@@@@@@@" (обход глюка в sed c подстановками).

      У меня образовалась задача: убрать все "@@@@@@@@" в строках начинающихся с "echo" или с "call *?:PrintOut", а строки начинающиеся как то иначе не трогать.

      Моих знаний такой regexp составить не получается.

      s/((echo)|(call *?:PrintOut))(.*?)@@@@@@@@/\1\4/g

      Но это совсем не то, что надо.

      p.s.
      s/@@@@@@@@//g - не прокатывает, она тогда всё вычищает под корень.

      Помогите или пните в каком направлении копать.
        И вот опять вечный баг: зачем непременно запихивать всю логику в один регвыр? Можно же решить задачу в два приема: выбрать строки с подходящими префиксами и затем в выбранных строках удалить все лишнее.
          Цитата AVA12 @
          И вот опять вечный баг: зачем непременно запихивать всю логику в один регвыр? Можно же решить задачу в два приема: выбрать строки с подходящими префиксами и затем в выбранных строках удалить все лишнее.

          Нет, не получится. (Хотя, конечно, затратив силы и измордовав код)
          Там идет выборка переменного количества строк из файла.
          sed -n Start,Stopp | и так далее по подстановкам...
          В общем, довольно сложно расковырять его на предлагаемое решение, да и усложнять многое, когда можно усложнить малое, не самое правильное решение с т.з. читабельности и понтяности кода.
            Ну, если поставлена задача "забить гвоздь непременно микроскопом", то, боюсь, никто не поможет.
              sed умеет не только подстановки делать. Там есть ещё и ветвления (включая условные) и метки. Поэтому вполне можно отделить строки содержащие echo и call …, обработать их и вывести.
              Так что повнимательнее почитай его описание
              Должно получиться что-то вроде
              ExpandedWrap disabled
                /^echo |^call +:PrintOut/ !b skip
                s/@@@@@@@@//g
                :skip
                p
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0223 ]   [ 15 queries used ]   [ Generated: 28.03.24, 18:39 GMT ]