Извлеките часть одной строки из файла с sed

Официальный ответ NetBSD должен использовать RPATH. Сумасшедший.

19
31.07.2013, 02:05
7 ответов

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
26
27.01.2020, 19:44
  • 1
    awk команда хороша - но только если у Вас есть пробелы вокруг =. Это не будет работать на POP3_SERVER_NAME=localhost. –  Marcel Stör 14.02.2016, 13:07
  • 2
    @Marcel, можно изменить разделитель, используемый awk от пробелов до чего-то еще использование -F. Например: -F "=" будет использовать = как разделитель в случае Вы упоминаете. –  mattpr 11.04.2018, 10:44

Похож у Вас есть файл конфигурации. То, что Вы могли сделать, подобно тому, что 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 особенно интересны для Вас.

7
27.01.2020, 19:44

Замените p команда заменой, которая удаляет нежелательную часть строки.

sed -n '3 s/^[^=]*= *//p' installation.sh

Можно хотеть соответствовать строке ключевым словом, а не положением.

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
7
27.01.2020, 19:44
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

Или если у Вас есть содержание в файле:

sed 's/.*= //' somefile.txt
localhost
5
27.01.2020, 19:44
  • 1
    хорошо, но я читал в своем файле как это: sed-n '3p' installation.sh –  Mercer 30.07.2013, 18:21
  • 2
    @Mercer - видят обновления, которые я добавил к ответу. –  slm♦ 30.07.2013, 18:25
  • 3
    @Adam Siemion - спасибо, но как указать на номер строки? –  Mercer 30.07.2013, 18:27

Несколько способов сделать это, рассматривая Ваш файл называют foobar:

Укажите шаблон для поиска:

PAT=POP3_SERVER_NAME

Использование извлечения sed

sed -n "/$PAT/p" foobar | sed "s/$PAT = //"

Или использование sed и cut

sed -n "/$PAT/p" foobar | cut -d' ' -f3
3
27.01.2020, 19:44

Можно использовать команду cut, установив разделитель в '=', а затем вывести второе поле так:

cut -d'=' -f2
5
27.01.2020, 19:44

Прелесть Linux / Unix в том, что обычно существует несколько способов чего-то добиться. В случае с оператором существует как минимум четыре различных способа извлечь имя POP-сервера из файла:

  1. grep POP3_SERVER_NAME installation.sh | cut -d '=' -f2
  2. grep POP3_SERVER_NAME installation.sh | awk '{print $ 3}'
  3. grep POP3_SERVER_NAME installation.sh | sed 's /.*= //'
  4. sed -n 's /^.* POP3_SERVER_NAME = // p' installation.sh
2
27.01.2020, 19:44

Теги

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