извлечь подстроку с помощью SED - PullRequest
1 голос
/ 07 мая 2020

У меня есть следующие строки: например:

     input1 = abc-def-ghi-jkl

     input2 = mno-pqr-stu-vwy

Я хочу извлечь первое слово между "-"

для первой строки, которую я хочу получить: def

, если вводится вторая строка, я хочу получить: pqr

Я хочу использовать команду SED , Могу пожалуйста, помогите мне?

Ответы [ 4 ]

3 голосов
/ 07 мая 2020

Используйте

sed 's,^[^-]*-\([^-]*\).*,\1,' file

Строка после первого - будет захвачена до второго -, а остальные будут сопоставлены, а затем сопоставленная строка будет заменена текстом группы.

1 голос
/ 07 мая 2020

С bash:

var='input1 = abc-def-ghi-jkl'
var=${var#*-}      # remove shortest prefix `*-`, this removes `input1 = abc-`
echo "${var%%-*}"  # remove longest suffix `-*`, this removes `-ghi-jkl`

Или с awk:

awk -F'-' '{print $2}' <<<'input1 = abc-def-ghi-jkl'

Используйте - в качестве разделителя полей ввода и распечатайте второе поле.


Или с cut:

cut -d'-' -f2 <<<'input1 = abc-def-ghi-jkl'
0 голосов
/ 07 мая 2020
Решение

grep (на мой взгляд, это наиболее естественный подход, поскольку вы пытаетесь найти совпадения только с регулярным выражением - вы не хотите редактировать что-либо, поэтому не должно быть требуется более продвинутая команда sed)

grep -oP '^[^-]*-\K[^-]*(?=-)' << EOF
> abc-qrs-bobo-the-clown
> 123-45-6789
> blah-blah-blah
> no dashes here
> mahi-mahi
> EOF

Вывод

qrs
45
blah

Пояснение

Посмотрите на сначала входные данные, включенные сюда для полноты как heredo c (более вероятно, что вы назвали бы свой файл последним аргументом grep.) Решение требует наличия как минимум двух тире в строка; в частности, для mahi-mahi совпадений не будет. Если вы хотите найти второй mahi как совпадение, вы можете удалить утверждение опережающего просмотра в конце регулярного выражения (см. Ниже).

Регулярное выражение делает это. Сначала обратите внимание на параметры команды: -o, чтобы вернуть только совпавшую подстроку, а не всю строку; и -P для использования расширений Perl. Затем регулярное выражение: начать с начала строки (^); ищите ноль или более не-da sh символов, за которыми следует da sh, а затем (\K) отбрасывайте эту часть требуемого совпадения из подстрок, найденных для соответствия шаблону. Затем снова найдите ноль или более символов, отличных от sh - это будет возвращено командой. Наконец, потребуйте da sh, следующего за этим шаблоном, но не включайте его в соответствие. Это делается с помощью опережающего просмотра (отмеченного (?= ... )).

0 голосов
/ 07 мая 2020

Если вы хотите использовать sed, вы можете выбирать между решениями, например

# Double processing
echo "$input1" | sed 's/[^-]*-//;s/-.*//'
# Normal approach
echo "$input1" | sed -r 's/^[^-]*-([^-]*)|-.*)/\1/g'
# Funny alternative
echo "$input1" | sed -r 's/(^[^-]*-|-.*)//g'

Очевидным «внешним» инструментом будет cut. Вы также можете посмотреть встроенное решение Bash, например

[[ ${input1} =~ ([^-]*)-([^-]*) ]] && printf %s "${BASH_REMATCH[2]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...