В основном, вам нужно скачать исходный текст пакета с wget или apt-get или что-то в этом роде...
Перейдите в каталог скачанных пакетов с помощью [1176932]cd my_package
Issue: [1176934]./configure --prefix=$HOME[1176935] или если вы не хотите, чтобы каталог находился в корне вашего HOME, создайте новый подкаталог в вашем HOME и измените команду соответственно.
make
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
ринт в случае успеха - так и начальные и конечные условия строки проверяются до того, как мы это сделаем.
sed -n '/^[[:upper:]]\w* symptom/s/ .*//p'
напечатайте строки, которые начинаются с заглавной буквы с симптомом
после него, и все, кроме первого слова, удалено.
Насколько я понимаю, вы хотите вывести любую строку, содержащую слово с заглавной буквы, сразу за которым следует слово симптом
. В этом случае:
$ 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