Возврат части строки, соответствующей шаблону

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

Двумя из моих фаворитов является dnsmasq и dnscache от djbdns.

2
16.11.2011, 14:58
3 ответа

Современная версия GNU grep, который делает жемчуг regexes, сделает:

grep -P -o '^Result: \K[^.]*'

-o говорит grep распечатывать только часть строки, которая соответствует. -P с \K в regex нулевая ширина, оглядываются утверждение, которое вызывает материал перед \K не быть частью соответствия (нулевая ширина).

См. также: grep может произвести только указанные группировки то соответствие?

3
27.01.2020, 21:57

Можно использовать sed. Как это:

sed -e 's/Result:\(.*\)\..*$/\1/g' file_name

если Вы хотите сохранить результат в том же файле, можно добавить -i кому: sed аргументы

2
27.01.2020, 21:57
  • 1
    Две проблемы с этим. Необходимо привязать Result к запуску строки (^Result), и необходимо использовать [^\.]* в группе, иначе если существует несколько периодов, группа будет соответствовать самому долгому соответствию до прошлого периода. проблемный оператор –  camh 16.11.2011, 15:11
  • 2
    @camh заявление говорит что "Результат": происходит только однажды в начале строки, таким образом, это не имеет никакого значения. И если проблема автора вопроса состоит в том, чтобы найти первый период, Вы правы относительно второй проблемы :) –  saeedn 16.11.2011, 15:19
  • 3
    Разве этот оператор не печатает также все незатронутые строки? –  enzotib 16.11.2011, 16:08
  • 4
    Попробуйте это: sed -nr 's/^Result:([^.]*).*/\1/p' .. это решает "вопросы"... btw. "одно возникновение строки "Результат": в начале строки" не исключает возможность Result: появление где-то в другом месте в строке (это зависит от точно, что он имеет в виду), таким образом помещая ^ на месте благоразумно... (PS, Вам не нужно запаздывание *, потому что .* является жадным. –  Peter.O 16.11.2011, 17:00
  • 5
    @camh: [\.] будет соответствовать и '\' и '.'... Выход бессмыслен в [square brackets] .. все является литеральным между ними.. –  Peter.O 16.11.2011, 17:57
<file_name sed -n 's/^Result: \([^.]*\)\..*/\1/p'
<file_name awk '/^Result:.*\./ {sub(/^Result: /,""); sub(/\..*/, ""); print}'
<file_name grep '^Result: .*\.' | sed 's/^Result: //' | sed 's/\..*//'

Если присутствие a . не требуется, изменение в

<file_name sed -n -e 's/\..*//' -e 's/^Result: //p'
<file_name awk '/^Result: / {sub(/^Result: /,""); print}'
<file_name grep '^Result: ' | sed 's/^Result: //'

См. этот ответ для фона для sed решений.

0
27.01.2020, 21:57
  • 1
    Что происходит, если нет никакого периода на "Результате": строка или никакое пространство после двоеточия в "Результате":? кроме того, первый sed сценарий не опускает не - "Результат": строки. –  Jander 17.11.2011, 18:12
  • 2
    @Jander спасибо за отчет об ошибках. Я взял присутствие a . быть требованием. Если это не, awk и grep+sed решения могут легко быть упрощены; sed решение становится менее компактным, но возможно легче читать. –  Gilles 'SO- stop being evil' 17.11.2011, 18:33

Теги

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