【问题标题】:I want to find some string in front of another string pattern, how to do it?我想在另一个字符串模式前面找到一些字符串,怎么做?
【发布时间】:2017-02-05 23:12:47
【问题描述】:

我想使用 bash shell 来分割字符串,例如:

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

我想获得品牌名称“Davionex Cream”和“DBL Aspirin” 我想把名字放在parttern ***mg or ***mcg or ***g

怎么做?

【问题讨论】:

  • 你试过了吗?

标签: regex linux bash shell


【解决方案1】:

如果您的示例输入具有代表性,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

【讨论】:

    【解决方案2】:

    在 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'
    

    【讨论】:

      【解决方案3】:

      你可以这样使用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/

      【讨论】:

      • 你能告诉我最后一个字符“.*/\1/”是什么意思
      • 它放置第一个通过 '(...)` 表达式匹配的模式。我们在此处使用的表达式中只有一个这样的匹配项。
      • 刚刚为答案添加了更多解释。
      • 我想使用类似的正则表达式来获得 50mcg/1g 30 g 但得到错误的反馈。你知道为什么吗? sed -E 's/^[[:alpha:] ]+ ([[:digit:]]+[mcg | mg | g]+) \[.*/\1/'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 2014-11-10
      • 2021-08-11
      相关资源
      最近更新 更多