The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Помогите с заменой слова в строке..., !*! THEDECAL, 27-Июн-12, 17:51  [смотреть все]
Пишу скрипт и я не могу сообразить как поменять третье (150000) слово на "1" в строке:

#l# 1284725281 150000

учитывая, что третье слово может быть разной длиной, а второе всегда одинаковой, но с разными цифрами

Я примерно вот так начал писать, а дальше не соображу:

sed 's/^#l#\ [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\ /#l#\ "вот тут уже не соображу"' ahistory.dat

  • Помогите с заменой слова в строке..., !*! stereoPANDA, 18:20 , 27-Июн-12 (1)
    echo "#l# 1284725281 150000" | awk '{print $1,$2,$3=1}'


    > Пишу скрипт и я не могу сообразить как поменять третье (150000) слово
    > на "1" в строке:
    > #l# 1284725281 150000
    > учитывая, что третье слово может быть разной длиной, а второе всегда одинаковой,
    > но с разными цифрами
    > Я примерно вот так начал писать, а дальше не соображу:
    > sed 's/^#l#\ [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\ /#l#\ "вот тут уже
    > не соображу"' ahistory.dat

  • Помогите с заменой слова в строке..., !*! Af., 23:21 , 27-Июн-12 (2)
    Bash только:

    shopt -s extglob
    str="#l# 1284725281 150000"
    echo "${str/% *([[:digit:]])/ 1}"
    echo "или если слово с буквами и цифрами"
    echo "${str/% *([[:alnum:]])/ 1}"

    Sed:


    str="#l# 1284725281 150000"
    sed 's/ [0-9]*$/ 1/' <<< "${str}"

    В обоих случаях использованы регулярные выражения, они ресурсоёмкие. А использование pipe "|" влечёт за собой +1 вызов экземпляра shell. На это, в свою очередь, тоже расходуются ресурсы-время. Какой из трёх вариантов (bash только, awk, sed) и в какой ситуации быстрее - не знаю.

    Кстати, вопрос ко всем, что быстрее работает (или должно бы быть быстрее)?

    P.S. Без регулярных выражений, Bash,
    условившись о постоянной длине первых двух слов:


    str="#l# 1284725281 150000"
    str="${str:0:14} 1"
    echo "${str}"
    str="$(cut -c1-14 <<< "${str}") 1"
    echo "${str}"

    • Помогите с заменой слова в строке..., !*! Af., 23:25 , 27-Июн-12 (3)
      Забыл. :) Если без длины слов, но условие - меняем последнее в строке слово:

      str="#l# 1284725281 150000"
      str="${str% *} 1"
      echo "${str}"

      • Помогите с заменой слова в строке..., !*! stereoPANDA, 23:54 , 27-Июн-12 (4)
        Af,
        Что бы узнать, что быстрее работает - выполните time:
        #time [command or script]
        Насколько мне хватает компетенции, я могу сказать, что в "погоне за временем" стараются придерживаться нескольких правил:
        1. Если все можно сделать на sed, то это будет быстрее чем sed + awk или + cut или + grep. Правило действует на все утилиты.
        2. Меньше пайпов, это следует,в принципе, из правила 1.
        3. sed работает быстрее всех. (это я где-то прочитал, проверял пару раз - поддтвердилось)

        А что касается реализации решения задачи на bash, то прошу расписать как ваша конструкция работает, ибо я 1й раз такое вижу.

        пс: а как вам  мое решение?

        > Забыл. :) Если без длины слов, но условие - меняем последнее в
        > строке слово:
        >

         
        > str="#l# 1284725281 150000"
        > str="${str% *} 1"
        > echo "${str}"
        >
        • Помогите с заменой слова в строке..., !*! Af., 19:46 , 28-Июн-12 (5)
          >> str="${str% *} 1"
          >>
          > как ваша конструкция работает, ибо я 1й раз такое вижу.
          > пс: а как вам  мое решение?

          Оно работает, что главное. С точки зрения простых манипуляций логами - не вижу принципиальных отличий между sed и awk. Склонен согласиться с http://stackoverflow.com/a/367014 Не могу оценивать с точки зрения сложных "рефаторингов" какого либо текста или кода. Но, не обладая доскональным пониманием синтаксисов как awk/sed, так и текста-цели, страшновато для сложных вещей "изобретать" собственные реализации инструментов на базе sed/awk и т.п. Неприятны вероятность ошибки и траты на исправления.

          Конструкция ${parameter%pattern} описана в разделе Parameter Expansion из man bash. '%' - оператор отрезать суффикс от значения переменной. То что правее '%' - шаблон, что подходит под шаблон вырезается. Если % одиночный, цель наикратчайшее совпадение. Двойной - самое длинное. '% *' означает последний пробел и что правее него.

          • Помогите с заменой слова в строке..., !*! LSTemp, 00:03 , 30-Июн-12 (6)
            >>> str="${str% *} 1"
            >>>
            >> как ваша конструкция работает, ибо я 1й раз такое вижу.
            >> пс: а как вам  мое решение?
            > Оно работает, что главное. С точки зрения простых манипуляций логами - не
            > вижу принципиальных отличий между sed и awk.

            здесь Вы не правы:

            основное преимущество sed, в том, что он ПОСТРОЧНО обрабатывает вход => минимальное потребление ресурсов ОС и независимость от размера входящего потока данных.

            основное преимущество awk в том, что его гибкость (читай использование скриптов) позволяет выполнить практически любую операцию над входным потоком данных и включать его в КОНВЕЙЕР. Он в отличие от sed работает не построчно с входящими данными, а с их блоками, что позволяет организовать более тонкую обработку. Но ресурсов ОС жрет тоже не много

            sed и awk - это классика.

            >[оверквотинг удален]
            > Не могу оценивать с точки зрения сложных "рефаторингов" какого либо текста
            > или кода. Но, не обладая доскональным пониманием синтаксисов как awk/sed, так
            > и текста-цели, страшновато для сложных вещей "изобретать" собственные реализации инструментов
            > на базе sed/awk и т.п. Неприятны вероятность ошибки и траты на
            > исправления.
            > Конструкция ${parameter%pattern} описана в разделе Parameter Expansion из man bash. '%'
            > - оператор отрезать суффикс от значения переменной. То что правее '%'
            > - шаблон, что подходит под шаблон вырезается. Если % одиночный, цель
            > наикратчайшее совпадение. Двойной - самое длинное. '% *' означает последний пробел
            > и что правее него.

            А тут я с Вами соглашусь. Поскольку задача явно скорее студенческого характера, то большие объемы данных обрабатывать вряд ли придется (sed/awk не нужен). Так что лучше пользоваться нативными средствами шела.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру