Официальный ответ NetBSD должен использовать RPATH. Сумасшедший.
awk мог бы быть лучшим инструментом здесь.
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
Поиск выравнивает, которые содержат "POP3_SERVER_NAME"; распечатайте последнее поле. Это не зависит от POP3_SERVER_NAME, всегда находящегося на строке 3, который является, вероятно, Хорошей Вещью.
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
В зависимости от Вашего приложения Вы, возможно, должны были бы сделать регулярное выражение более строгим. Например, Вы могли бы хотеть соответствовать только, что строка, которая запускается с POP3_SERVER_NAME.
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
Используя sed немного менее интуитивно. (Спасибо, я знаю об иронии.) Обращаются к строке, которая содержит POP3_SERVER_NAME где угодно. Замените пустой строкой весь текст с начала строки к дополнительному пространству после "=". Затем печать.
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
Похож у Вас есть файл конфигурации. То, что Вы могли сделать, подобно тому, что Adam предлагают Siemeon/slm:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
где [^=]
исключает все '=' символы, +
говорит один или несколько из того же типа символа, сопровождаемый фактическим =
, \s
любой пробел (включая вкладки \t
и новые строки \n
, \r\n
, и плоскость располагает с интервалами '', тогда как *
нуль средств или больше того же типа, круглые скобки ловят то, что внутри для размещения подобранных последовательностей символов в \1, \2..., \n заменяющие заполнители, $
означает конец строки. Это следует за типичным заменяющим шаблоном: s/.../.../modifiers
. Параметр командной строки -r
обозначает расширенный regex синтаксис (для удобства) и -n
средства ничего не производят до или если explcitly не запросил. p
модификатор распечатывает результат.
Вы могли сделать глобальный поиск с g
модификатор как:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
так, чтобы Вы разделили строку ' '
(мог быть \n
, \t
, или что имеет Вас), который можно обработать легко.
Оба допустимы, обеспечил Ваши значения, которым предшествует промежуток символа уравнения в конец строки, и не сопровождаются комментариями или другими символами с семантикой, отклоняющейся от простого "значения".
Я еще не могу прокомментировать здесь сообщения других. Для указания на строку просто передают номер строки, в случае 3, прежде s
или перед символом кавычки инициирования (точно так же, как в энергии).
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
Смотрите на info sed
. Например, 3.2 и 4.7 особенно интересны для Вас.
Замените p
команда заменой, которая удаляет нежелательную часть строки.
sed -n '3 s/^[^=]*= *//p' installation.sh
Можно хотеть соответствовать строке ключевым словом, а не положением.
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
Или если у Вас есть содержание в файле:
sed 's/.*= //' somefile.txt
localhost
Несколько способов сделать это, рассматривая Ваш файл называют foobar
:
Укажите шаблон для поиска:
PAT=POP3_SERVER_NAME
Использование извлечения sed
sed -n "/$PAT/p" foobar | sed "s/$PAT = //"
Или использование sed
и cut
sed -n "/$PAT/p" foobar | cut -d' ' -f3
Можно использовать команду cut, установив разделитель в '=', а затем вывести второе поле так:
cut -d'=' -f2
Прелесть Linux / Unix в том, что обычно существует несколько способов чего-то добиться. В случае с оператором существует как минимум четыре различных способа извлечь имя POP-сервера из файла:
grep POP3_SERVER_NAME installation.sh | cut -d '=' -f2
grep POP3_SERVER_NAME installation.sh | awk '{print $ 3}'
grep POP3_SERVER_NAME installation.sh | sed 's /.*= //'
sed -n 's /^.* POP3_SERVER_NAME = // p' installation.sh
awk
команда хороша - но только если у Вас есть пробелы вокруг=
. Это не будет работать наPOP3_SERVER_NAME=localhost
. – Marcel Stör 14.02.2016, 13:07awk
от пробелов до чего-то еще использование-F
. Например:-F "="
будет использовать=
как разделитель в случае Вы упоминаете. – mattpr 11.04.2018, 10:44