Beri bash i ebash / Говнокод #3772 Ссылка на оригинал

0

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

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

Запостил: checkist checkist, (Updated )

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

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

    хотя нет, кажется попал пальцем в лужу: там же начало и конец ограничены. Так каким образом в [:space:] попало as?
    Ответить
        • А я не знаю, что на меня нашло. В других местах того же скрипта так и написано: '/^\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.
              Ответить
                • 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 каком-то.

                        Короче, гнусная недокументированная фича!
                        Ответить
                          • Стопудов!
                            И портабельнее. Кстати, о портабельности и в гнусном мануале сказано, что точно портабельны будут только \n и \\.
                            Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8