1. bash / Говнокод #3772

    −130

    1. 1
    sed '/^[:space:]*$/d'

    Проблема была: помимо пустых строк код ВНЕЗАПНО удалял строчки, состоящие из слова "as" (через этот код проходят SQL-скрипты).

    Запостил: checkist, 23 Июля 2010

    Комментарии (16) RSS

    • ну, кто-то перепутал звездочку и плюсик, это не такой уж говнокод. Хотя юниксоиду стыдно не знать регулярок: это же кровь и плоть шелла

      хотя нет, кажется попал пальцем в лужу: там же начало и конец ограничены. Так каким образом в [:space:] попало as?
      Ответить
      • [[:space:]] должно быть
        Ответить
        • аа)) ок)
          я бы \s написал
          Ответить
          • А я не знаю, что на меня нашло. В других местах того же скрипта так и написано: '/^\s*$/d'
            Ответить
            • И что, работает? Даже просмотрел гнушное расширение, всякие \w нашел, а \s нет.
              Ответить
              • Насколько помню в питоне в модуле re \s = пробельные символы, \S = непробельные. Или я выпал из контекста?
                Ответить
                • В sed я их не видел. В стандарте точно нет, в гнусном расширении есть возможность матчить слова, как и в emacs-regexp, скажем, но, в целом, там не очень много чего добавлено.
                  Это же чистые PCRE, но много где сперты, в питоне, как мне помнится, как раз они используются, да. Я, впрочем, питон только на уровне конфигурирования cvs2svn знаю:)

                  А PCRE, вообще, придумали демоны красноглазые, для того, чтобы окончательно запутать и так непростую нотацию!:)
                  Ответить
              • в man sed есть такая строчка: "The \n sequence in a regular expression matches the newline character, and similarly for \a, \t, and other sequences". Как я понимаю, в числе "other sequences" оказываются обычные регэксповые \s, \S, \d, \D, \w, \W.
                Ответить
                • Я бы скорее предположил, что под остальными имеются в виду стандартные последовательности, которые есть в стандарте в главе «File Format Notation»
                  http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap05.html#tagtcjh_2
                  Ответить
                  • nil, у меня нет оснований сомневаться в том, что ты знаешь спецификации :)
                    Но \s в sed работает корректно :)
                    Ответить
                    • Вот!
                      И меня расстраивает, что я не могу понять, почему:)

                      Есть идея... Удаляются только строчки вида /^$/, или строчки /^ $/ тоже удалятся?
                      Ответить
                      • Строчки с пробелами тоже удаляются - проверил только что :)
                        Ответить
                        • Да, я тоже проверил. На AIX-e родным не удаляются, и то хлеб:)
                          Покурил еще стандарт, где сказано:

                          The interpretation of an ordinary character preceded by a backslash ( '\' ) is undefined, except for:
                          * The characters ')', '(', '{', and '}'
                          * The digits 1 to 9 inclusive (see BREs Matching Multiple Characters)
                          * A character inside a bracket expression

                          В стандарте на sed не сказано ничего про дополнения к BRE, кроме \n.

                          В гнусном sed сказано про \w, \W, \b, \B.

                          Вот еще ресурс: http://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq6_008.html
                          Тоже, упоминается только в sedmod каком-то.

                          Короче, гнусная недокументированная фича!
                          Ответить
                          • То есть, надёжнее всё-таки юзать [[:space:]] ?
                            Ответить
                            • Стопудов!
                              И портабельнее. Кстати, о портабельности и в гнусном мануале сказано, что точно портабельны будут только \n и \\.
                              Ответить
    • bash, my ass
      Ответить

    Добавить комментарий