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

    −129

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    # $1 - the string to be trimmed
    trim_whitespace () {
        local text=${1}
    
        printf "$text" | awk '{gsub(/^[ ]*/,"",$0); gsub(/[ ]*$/,"",$0) ; print }'
    }

    oVirt, не какая-то пионерская поделка...

    Запостил: raorn, 27 Июля 2010

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

    • Вот ни за что не поверю, что им не хватило бы простого и циничного echo -n $text без всяких awk.
      Ответить
      • Ваш вариант потеряет двойные пробелы внутри строки.
        Ответить
        • ага. Именно поэтому я и написал насчет того, что не верю, что им не хватит.
          Но тут ничего утверждать нельзя, все зависит от ввода и от поставленной задачи.
          Ответить
    • trim() {
      local s="$1"
      set -- $s
      s="$1${s#*$1}"
      shift $(($#-1))
      s="${s%$1*}$1"
      printf '[%s]\n' "$s"
      }

      вот эта функция удалит пробелы с начала и конца строки, не меняя ничего внутри.
      Ответить
      • Коллега, вы обфускатор!
        Ответить
      • tryam() {
          local s="$1"
          (
            shopt -qs extglob
            s=${s##*( )}
            printf "${s%%*( )}"
          )
        }
        Ответить
        • Ничего сложного в моём коде нет :)
          В нём обычные конструкции, описанные в posix.

          В вашем коде есть несколько нюансов:
          1. shopt это башизм т.е. в dash этот код работать не будет... cобственно как и ${s%%*( )}.

          2. (...), $(...) и `...` очень дорогие операции в шелле т.к. требуют создания отдельного контекста.

          3. у printf первым аргументом идёт форматная строка. Если в $s окажутся специальные символы (например %s) то ваш скрипт огорчится. Эта проблема типична и для Cи, когда пишут printf(foo);
          Ответить
          • local - тоже не стандарт, так что особо не напрягался:)
            В моем примере подпроцесс чисто для того, чтобы не менять extglob, альтернативой можно сохранять значение и восстанавливать перед выходом.
            printf опять-таки взят из исходного примера.

            А если чисто по стандарту, лучше все-таки с помощью sed - нагляднее, единственно, что времени скушает на запуске. Однако, в примере один хрен awk используется, так что особо там не оптимизировали, и еще вопрос, надо ли...
            Ответить
            • local - стандарт de-facto ... его нет в стандарте, но во всех реализациях шеллов эта директива присутствует.
              Ответить
              • Ну, я тут не скажу за все реализации, но я придерживаюсь мнения, что либо написано по стандарту, либо нет, это как с немножко беременностью:)
                Впрочем, некоторые шеллы не поддерживают стандарт в других, более пикантных местах, так что все равно страшно жить!
                Ответить
                • Ну если не использовать local (т.е. если считать, что все переменные глобальные), то нужно будет в функцию передавать имя переменной, которую можно использовать ... только я такую функцию даже приводить тут не стану ... она будет ужасна.
                  Ответить
                  • Нафиг нам вообще переменная? set же есть!:)
                    trim () { (shopt -qs extglob; set -- "${1##*( )}"; printf "${1%%*( )}"); }
                    Ответить
                    • переменная нужна только, чтобы уйти от башизма :)
                      Ответить

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