Regex 在bash中提取包含数字的部分路径
在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
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