колотите строковое извлечение

Ответ на другую половину вопроса, на том, почему это происходит: часы Компьютерного оборудования известно неточны, поэтому в то время как дрейф 12 секунд за день необычен, это не действительно все что необычный.

(Это, вероятно, из-за распространенности использования сетевого времени, так, чтобы дрейф даже 12 секунд в день был незначительным раздражением по сравнению с тем, чем это было бы в часах - и таким образом компании-производители оборудования могут использовать дешевые микросхемы синхрогенератора. Физически, что происходит, вероятно, что осциллятор в Вашей микросхеме синхрогенератора не калибруется совершенно верно, таким образом, это работает немного-но-надежно медленный.)

3
27.12.2012, 11:54
4 ответа

Использовать ${VAR%PATTERN} удалить суффикс, соответствующий последнему полю, затем ${NEWVAR##PATTERN} удалить префикс, соответствующий всем кроме последнего остающегося поля.

all_but_last_field=${mystring%.*}
second_to_last_field=${all_but_last_field##*.}

Необходимо сохранить строку в переменной и сохранить промежуточный результат в переменной также, Вы не можете непосредственно объединить расширения в цепочку (Вы можете в zsh, но не в ударе).

1
27.01.2020, 21:14
  • 1
    у Вас есть незначительная опечатка, Ваш второй оператор должен был упомянуть $all_but_last_field как second_to_last_field=${all_but_last_field##*.}. Я принимаю Ваш ответ, поскольку это - чистый удар, но ответ Drake Clarris был большим также. Это на самом деле еще более компактно, но я могу только выбрать 1 ответ. Спасибо парни :) –  icasimpan 28.12.2012, 02:56

С чистым bash:

IFS='.' read -a p <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'
echo "${p[${#p[@]}-2]}"

Можно сделать это легче с awk:

awk -F. '{print$(NF-1)}' <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'

В случае, если Ваши строки для парсинга являются именами файлов, можно все еще сделать это с awk:

awk -F. 'BEGIN{for(i=1;i<ARGC;i++){$0=ARGV[i];print$(NF-1)}}' foo*
5
27.01.2020, 21:14
  • 1
    +1 для самого лучшего ответа. Ваш echo было бы более хорошим таким образом: echo "${p[@]:(-2):1}". –  gniourf_gniourf 27.12.2012, 12:30
  • 2
    Инструмент для очистки, короче, быстрее. Большой, @gniourf_gniourf. –  manatwork 27.12.2012, 13:02
  • 3
    gniourf_gniourf и manatwork: отличное решение. Я не являюсь так хорошо сведущим с awk, но с Вашей справкой, я узнаю еще немного об этом. +1 вам обоим :) –  icasimpan 28.12.2012, 02:53

A sed команда, чтобы сделать это:

sed 's/foo_[0-9.]*\([^.]*\).*/\1/' inputfile

Принятие, конечно, это inputfile содержит Ваши строки, каждого на его собственной строке (поскольку Ваш пример, кажется). Если говорят, что Вы используете имена файлов, то, передавая результаты по каналу ls в sed будет работать также.

2
27.01.2020, 21:14
  • 1
    Хороший, но это [0-9.] его слабость – перестанет работать на имени файла как “foo_1.103b.debug_xx.ver21-inc-1”. Лучше положитесь строго на точки: sed 's/.*\.\([^.]*\)\.[^.]*$/\1/'. –  manatwork 27.12.2012, 17:15
  • 2
    Да я использовал числа, потому что в его примере, который казался более последовательным, чем точки. –  Drake Clarris 27.12.2012, 19:55
  • 3
    +1 Drake Clarris для того, чтобы предоставить исходное решение и +1 для Вас manatwork также для рассмотрения кода. Но да, я соглашаюсь с решением Drake Clarris, он пытался быть намного более практичным. Но Ваше решение помогло бы в случае, если мой шаблон изменяет :) –  icasimpan 28.12.2012, 02:37

принятие их является файлами:

нечто ls* | awk-F. '{Печатают 3$}'

-2
27.01.2020, 21:14
  • 1
    1, Это не третий столбец на основе точек для всех записей –  Bernhard 27.12.2012, 11:56
  • 2
    , о, действительно? Насколько я знаю, что индекс запускается в 1 не 0... И просто протестированный это в соответствии с Linux колотит 4.1.2... foo_1.103.debug_xx.ver21-inc-1 1$ = foo_1$ $2 =103 3 =debug_xx 4$ =ver21-inc-1 тестируют его на себя... –  BitsOfNix 27.12.2012, 11:59
  • 3
    Протестируйте его снова: Попытка pastebin.com/wvsPm7AV –  manatwork 27.12.2012, 12:01
  • 4
  • 5
    @AlexandreAlves, gniourf_gniourf относится к GreyCat, Почему Вы не должны анализировать вывод ls (1) статья. В случае, если имена файлов содержали бы пространство, как “foo_1.103.de bug_xx.ver21-inc-1”, Ваш ls основанное решение отобразилось бы “de\bug_xx”. Это может быть исправлено с ls --quoting-style=literal. Но если имена файлов содержали бы новую строку, парсинг был бы, стал более сложным. установка –  manatwork 27.12.2012, 12:56

Теги

Похожие вопросы