Слово для поиска, которому предшествует имя в Sed

[1176197] Нет простого способа сделать это, если он есть... Вы можете попробовать пойти по следующему пути, я сделал это однажды и сказал: "Больше никогда".

В основном, вам нужно скачать исходный текст пакета с wget или apt-get или что-то в этом роде...

Перейдите в каталог скачанных пакетов с помощью [1176932]cd my_package

Issue: [1176934]./configure --prefix=$HOME[1176935] или если вы не хотите, чтобы каталог находился в корне вашего HOME, создайте новый подкаталог в вашем HOME и измените команду соответственно.

make

  • make install
  • This should be the steps.
  • Удачи :)[1176204]
1
13.04.2017, 15:36
3 ответа
sed '/^[[:upper:]][[:lower:]]\{1,\} symptom$/!d
    H;x;/^\n/!q;s///;x;d'

Это будет искать строки, начинающиеся с символа верхнего регистра, за которым следует один или несколько символов нижнего регистра, затем только <пробел> и строка признак . Если текущая строка не совпадает, то выбирается d и сценарий запускается заново сверху со следующей строкой ввода.

Если он соответствует , он копируется в H старое пространство после вставленного разделителя \ n электронной строки. В первый раз, когда это произойдет h старое пространство будет пустым, поэтому ведущим символом будет \ n ewline. После того, как совпадающая строка будет полем H , старые h и шаблонные пространства будут изменены e x . Если есть ! не ведущая \ n строка в пространстве шаблонов в то время, тогда sed q вводит ввод - внезапно перестает читать вводимые данные ( или вообще выполнить какие-либо другие команды в его сценарии - например, d ) . Но когда есть ведущая \ n строка ewline удаляется, а h старый, а пространства шаблонов снова изменяются e x , а пространство шаблонов становится d избран.

Результатом является первая встречаемая строка, она удерживается, и ее обозначающий маркер первого вхождения сохраняет ее из q ввода ввода, но второй раз, когда это происходит, завершает обработку.

Но может я неправильно понял? Как я понял, вы имели в виду, что вам нужны только первые два совпадения в файле.

Если вам нужно только Имя if симптом $ , это легко:

sed -n '/^[[:upper:]][[:lower:]]\{1,\} [^ ]*$/s/ symptom$//p'

Здесь мы просто проверяем, что мы определенно смотрим на вероятно совпадающая строка еще до попытки s /// ubstitution - потому что ubstitution s /// является функцией родительского адреса. Если это правда, мы пытаемся обрезать нежелательный хвостовой путь и только p ринт в случае успеха - так и начальные и конечные условия строки проверяются до того, как мы это сделаем.

2
27.01.2020, 23:20
sed -n '/^[[:upper:]]\w* symptom/s/ .*//p'

напечатайте строки, которые начинаются с заглавной буквы с симптомом после него, и все, кроме первого слова, удалено.

1
27.01.2020, 23:20

Насколько я понимаю, вы хотите вывести любую строку, содержащую слово с заглавной буквы, сразу за которым следует слово симптом . В этом случае:

$ sed -rn '/\b[[:upper:]][[:lower:]]*[[:space:]]+symptom/p' data
Mikael symptom
David symptom

Для удобства я использовал \ b , что означает границу слова. По крайней мере, это поддерживается GNU sed. Сообщите мне, если ваш sed не поддерживает его.

Как это работает:

Основная форма:

sed -n '/pattern/p' file

При этом печатаются только строки, соответствующие шаблону . В нашем случае шаблон состоит из:

  • \ b

    Соответствует только границе слова.

  • [[: upper:]] [[: lower:]] *

    Соответствует букве верхнего регистра, за которой следует ноль или более нижних регистр букв.

    Обратите внимание, что в старину это могло быть написано [A-Z] [a-z] + . Из-за юникода это теперь ненадежно. Вышеуказанное использует классы символов верхний и нижний и, следовательно, безопасен для Unicode.

  • [[: space:]] + симптом

    Соответствует одному или нескольким пробелам, за которыми следует слово симптом .

Альтернатива

Предположим, вы хотите вывести только имена, предшествующие симптому :

$ sed -rn 's/\b([[:upper:]][[:lower:]]*)[[:space:]]+symptom.*/\1/p' data
Mikael
David
1
27.01.2020, 23:20

Теги

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