Я хочу найти некоторую строку перед другим шаблоном строки, как это сделать?

Я хочу использовать оболочку Bash для разделения строки, как:

Calcipotriol - Daivonex Cream 50mcg/1g 30 g [1]
Aspirin - DBL Aspirin 100mg [1] tablet

Я хочу получить фирменное наименование "Davionex Cream" и "DBL Aspirin". Я хочу получить название перед куропаткой *** мг или *** мкг или *** г

как это сделать?

3 ответа

Решение

В Bash вы можете сделать:

while IFS= read -r line || [[ -n "$line" ]]; do
    if [[ "$line" =~ ^([[:alpha:]]+)[[:space:][:punct:]]+([[:alpha:][:space:]]+)[[:space:]](.*)$ ]]
    then
         printf "1:'%s' 2:'%s' 3:'%s'\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
    fi  
    done <<<"Calcipotriol - Daivonex Cream 50mcg/1g 30 g [1]
Aspirin - DBL Aspirin 100mg [1] tablet" 

Печать:

1:'Calcipotriol' 2:'Daivonex Cream' 3:'50mcg/1g 30 g [1]'
1:'Aspirin' 2:'DBL Aspirin' 3:'100mg [1] tablet'

Если ваш образец ввода является репрезентативным, awk может предложить самое простое решение:

awk -F'- | [0-9]+(mc?)?g' '{ print $2 }' <<'EOF'
Calcipotriol - Daivonex Cream 50mcg/1g 30 g [1]
Aspirin - DBL Aspirin 100mg [1] tablet
Foo - Foo Bar 22g [1] other
EOF

выходы:

Daivonex Cream
DBL Aspirin
Foo Bar

Ты можешь использовать sed сюда:

sed -E 's/^[[:alpha:]]+ - ([[:alpha:] ]+) [[:digit:]]+.*/\1/' <<< "Calcipotriol - Daivonex Cream 50mcg/1g 30 g [1]"

=> Daivonex Cream
  • ^[[:alpha:]]+ - => соответствует всем символам до тех пор, пока шаблон не должен быть извлечен
  • ([[:alpha:] ]+) => это часть, которую мы хотим извлечь
  • [[:digit:]]+.* => это все, что будет после; мы предполагаем, что эта часть начинается с пробела и одной или нескольких цифр, за которыми следует любое количество символов
  • \1 => часть, извлеченная (...) выражение выше; мы заменяем всю строку на соответствующую часть

Вы можете проверить этот сайт, чтобы узнать больше о регулярных выражениях: http://regexr.com/

Другие вопросы по тегам