Я хочу найти некоторую строку перед другим шаблоном строки, как это сделать?
Я хочу использовать оболочку 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/