【问题标题】:Getting (not cutting) specific substring from bash string从 bash 字符串中获取(不切割)特定子字符串
【发布时间】:2020-02-28 14:05:27
【问题描述】:

我想从字符串"VALUE3,VALUE2,VALUE4,VALUE9" 中获取子字符串 VALUE1 或 VALUE2,如果这些都没有,那么我的 $VAR 应该为空。

我的字符串不能同时有两个子字符串,所以我们只有 3 种可能性。

VAR=VALUE1 VAR=VALUE2 VAR=NULL

我想在一行中做到这一点:

STRING="VALUE3,VALUE2,VALUE4,VALUE9,VALUE7"
VAR=`echo $STRING | grep -P "(VALUE1|VALUE2)"`
echo $VAR
VALUE2

【问题讨论】:

  • 使用 grep -o -P "(VALUE1|VALUE2)" 对我有用,如果您需要在未找到任何内容时将该值设为空。

标签: bash awk sed cut


【解决方案1】:

如果没有找到VALUE1VALUE2,这将打印NULL。

echo "VALUE3,VALUE1,VALUE4,VALUE9" | awk '
{
  if(match($0,/VALUE[12],|VALUE[12]$/)){
    val=substr($0,RSTART,RLENGTH)
    sub(/,/,"",val)
    print val
  }
  else{
    print "NULL"
  }
}'

或将其用于变量用途,例如:

VAR=$(echo "VALUE3,VALUE1,VALUE4,VALUE9" | awk '{if(match($0,/VALUE[12],|VALUE[12]$/)){val=substr($0,RSTART,RLENGTH);sub(/,/,"",val);print val} else{print "NULL"}}')
echo "$VAR"
VALUE1

在既不是VALUE1 也不是VALUE2 的情况下在输出中获取NULL 的示例:

VAR=$(echo "VALUE3,VALUE12,VALUE4,VALUE9" | awk '{if(match($0,/VALUE[12],|VALUE[12]$/)){val=substr($0,RSTART,RLENGTH);sub(/,/,"",val);print val} else{print "NULL"}}')
echo "$VAR"
NULL

【讨论】:

  • 我做了快速测试,它总是给我NULL。如果我的字符串有,我想获得 VALUE1 或 VALUE2。
  • @dzafer,是的,确实如此,请检查我的帖子一次,它对我来说很好。
  • 完美,现在可以使用了。我稍微修改了一下。我删除了 VALUE[12] 后面的 $ 这个对我有用: VAR=$(echo "VALUE3,VALUE32,VALUE4,VALUE9" | awk '{if(match($0,/VALUE[12]/)){print substr($0,RSTART,RLENGTH)} else{print "NULL"}}')
  • @dzafer,好吧,似乎正则表达式中有一个极端情况,如果在最后一行找到 VALUE1 或 VALUE2,所以我现在也已经介绍了该部分,考虑到您的实际 Input_file 将与展示样品,干杯。
猜你喜欢
  • 1970-01-01
  • 2013-08-12
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2012-12-28
相关资源
最近更新 更多