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

0

  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 raorn, (Updated )

Комментарии (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%%*( )}"); }
                  Ответить
                  • переменная нужна только, чтобы уйти от башизма 🙂
                    Ответить

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

Переведи на "PHP", guest!

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


    8