sed получить часть строки - PullRequest
0 голосов
/ 14 июля 2020

У меня есть строки кода, которые выглядят так:

hi:12345:234 (вторая строка)

Как мне написать строку кода, используя команду sed, которая выводит только 2-ю строку элемент во второй строке?

Моя текущая команда выглядит так:

sed -n '2p' file которая получает вторую строку, но я не знаю, какое регулярное выражение использовать для соответствия только второму элементу '12345' и объединить с моей текущей командой

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Не могли бы вы попробовать следующие, написанные и протестированные с показанными образцами в GNU sed.

sed -n '2s/\([^:]*\):\([^:]*\).*/\2/p' Input_file

Пояснение: Использование опции -n sed остановит печать для всех строк, и печать будет происходить только для тех строк, где мы явно упоминаем опцию p для печати (позже в коде). Тогда упоминание 2s означает выполнение замены только во второй строке. Затем с помощью регулярного выражения и возможности sed сохранять согласованное регулярное выражение во временном буфере, с помощью которого значения могут быть извлечены позже путем нумерации 1,2...and so on. Регулярное выражение в основном захватывает 1-ю часть, которая идет до первого появления :, а затем 2-ю часть после первого появления : до 2-го появления : в соответствии с запросом OP. Таким образом, при выполнении замены упоминание /2 заменит всю строку вторым значением, хранящимся в буфере, в соответствии с запросом, затем упоминание p напечатает эту часть только во второй строке.

1 голос
/ 14 июля 2020

Несколько решений:

echo "hi:12345:234" | sed -n '2s/.*:\([0-9]*\):.*/\1/p'
echo "hi:12345:234" | sed -n '2{s/^[^:]*://; s/:.*//p; q}'
echo "hi:12345:234" | awk -F':' 'FNR==2{print $2}'

Весь дисплей 12345.

sed -n '2s/.*:\([0-9]*\):.*/\1/p' отображает только захваченное значение благодаря параметрам / флагу -n и p. Он соответствует всей строке, захватывая цифры между двумя двоеточиями, \1 сохраняет только захват.

sed -n '2{s/^[^:]*://;s/:.*//p;q}' удаляет все от начала до первого :, все от второго до конца, а затем завершает работу ( q), поэтому, если ваш файл большой, он будет обработан быстрее.

awk -F':' 'FNR==2{print $2}' разделяет вторую строку двоеточием и извлекает второй элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...