Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在bash中提取包含数字的部分路径_Regex_Bash_Awk - Fatal编程技术网

Regex 在bash中提取包含数字的部分路径

Regex 在bash中提取包含数字的部分路径,regex,bash,awk,Regex,Bash,Awk,在bash中,给定如下路径: mypath='my/path/to/version/5e/is/7/here' 我想提取包含数字的第一部分。对于我想提取的示例:5e 有没有比在使用while时循环检查每个零件的编号更好的方法 while IFS=/ read part do if [[ $part =~ *[0-9]* ]]; then echo "$part" fi done <<< "$mypath" 而I

在bash中,给定如下路径:

mypath='my/path/to/version/5e/is/7/here'
我想提取包含数字的第一部分。对于我想提取的示例:
5e

有没有比在使用while时循环检查每个零件的编号更好的方法

while IFS=/ read part
do
   if [[ $part =~ *[0-9]* ]]; then
      echo "$part"
   fi
done <<< "$mypath"
而IFS=/read part
做
如果[[$part=~*[0-9]*]];然后
回显“$part”
fi
完成
  • 用换行符替换
    /
  • 用数字筛选第一个匹配项
  • mypath='my/path/to/version/5e/is/7/这里'
    
    请您尝试以下,书面和测试显示的样品。如果行中的值也超过1,则应打印此项。若你们谈论更好的方法,
    awk
    可能比纯bash循环+regex解决方案IMHO更快,所以在这里添加它

    awk -F'/' '
    {
      val=""
      for(i=1;i<=NF;i++){
        if($i~/[0-9][a-zA-Z]/ || $i~/[a-zA-Z][0-9]/){
          val=(val?val OFS:"")$i
        }
      }
      print val
    }' Input_file
    
    awk-F'/''
    {
    val=“”
    对于(i=1;i使用Bash的正则表达式:

    [[ "$mypath" =~ [^/]*[0-9]+[^/]* ]] && echo "${BASH_REMATCH[0]}" 
    5e
    
    使用Perl:

    mypath='my/path/to/version/5e/is/7/here'
    
    # Method 1 (using for loop):
    echo "${mypath}" | perl -F'/' -lane 'for my $dir ( @F ) { next unless $dir =~ /\d/; print $dir; last; }'
    
    # Method 2 (using grep):
    echo "${mypath}" | perl -F'/' -lane 'my $dir = ( grep { /\d/ } @F )[0]; print $dir if defined $dir;'
    
    # Prints:
    # 5e
    
    Perl one liner使用以下命令行标志:
    -e
    :告诉Perl在线查找代码,而不是在文件中。
    -n
    :一次循环输入一行,默认情况下将其分配给
    $。
    -l
    :在行内执行代码之前,先去掉输入行分隔符(
    “\n”
    ,默认情况下在*NIX上),然后在打印时将其追加。
    -a
    :在空格或
    -F
    选项中指定的正则表达式上将
    $\ucode>拆分为数组
    @F

    -F'/'
    :在
    /
    上拆分为
    @F
    ,而不是在空白处

    next,除非$dir=~/\d/;
    :如果路径的当前部分*不包含数字(
    \d
    ),则跳过循环的其余部分。
    last;
    :退出循环(这里,它也退出脚本),以便只打印匹配目录的第一个匹配项。
    grep{…}LIST
    :对于
    LIST
    参数,返回表达式
    ..
    为真的元素列表,这里返回所有具有数字的路径元素列表。
    (LIST)[0]
    :返回列表的第一个元素,这里是带数字的第一个path元素

    另请参见:



    另一个bash变体

    mypath='my/path/to/app version/5e/is/7/here'
    until [[ ${mypath:0:1} =~ [0-9] ]]; do
        mypath=${mypath#*/}
    done
    echo ${mypath%%/*}
    

    方法使用“grep-o”

    echo $mypath | grep -o -E '\b[^/]*[0-9][^/]*\b' | head -1
    

    使用
    awk
    ,将
    RS
    设置为
    /
    ,并打印包含数字的第一条记录

    awk -v RS=/ '/[0-9]/{print;exit}' <<< "$mypath"
    5e
    
    awk-vrs=/'/[0-9]/{print;exit}'
    
    mypath='my/path/to/app version/5e/is/7/here'
    until [[ ${mypath:0:1} =~ [0-9] ]]; do
        mypath=${mypath#*/}
    done
    echo ${mypath%%/*}
    
    echo $mypath | grep -o -E '\b[^/]*[0-9][^/]*\b' | head -1
    
    awk -v RS=/ '/[0-9]/{print;exit}' <<< "$mypath"
    5e