【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
给定文件名格式someletters_12345_moreleters.ext
,我想提取5位数字并将其放入变量中。
因此,为了强调这一点,我有一个文件名,其中包含x个字符,然后是一个五位数的序列,在两侧用单个下划线包围,然后是另一组x个字符。 我想使用5位数字并将其放入变量中。
我对实现此目标的许多不同方式非常感兴趣。
#1楼
如果有人需要更严格的信息,您也可以像这样在man bash中搜索它
$ man bash [press return key]
/substring [press return key]
[press "n" key]
[press "n" key]
[press "n" key]
[press "n" key]
结果:
${parameter:offset} ${parameter:offset:length} Substring Expansion. Expands to up to length characters of parameter starting at the character specified by offset. If length is omitted, expands to the substring of parameter start‐ ing at the character specified by offset. length and offset are arithmetic expressions (see ARITHMETIC EVALUATION below). If offset evaluates to a number less than zero, the value is used as an offset from the end of the value of parameter. Arithmetic expressions starting with a - must be separated by whitespace from the preceding : to be distinguished from the Use Default Values expansion. If length evaluates to a number less than zero, and parameter is not @ and not an indexed or associative array, it is interpreted as an offset from the end of the value of parameter rather than a number of characters, and the expan‐ sion is the characters between the two offsets. If parameter is @, the result is length positional parameters beginning at off‐ set. If parameter is an indexed array name subscripted by @ or *, the result is the length members of the array beginning with ${parameter[offset]}. A negative offset is taken relative to one greater than the maximum index of the specified array. Sub‐ string expansion applied to an associative array produces unde‐ fined results. Note that a negative offset must be separated from the colon by at least one space to avoid being confused with the :- expansion. Substring indexing is zero-based unless the positional parameters are used, in which case the indexing starts at 1 by default. If offset is 0, and the positional parameters are used, $0 is prefixed to the list.
#2楼
我很惊讶这种纯bash解决方案没有出现:
a="someletters_12345_moreleters.ext"
IFS="_"
set $a
echo $2
# prints 12345
您可能希望将IFS重置为之前的值,或者之后将其unset IFS
!
#3楼
类似于PHP中的substr('abcdefg',2-1,3):
echo 'abcdefg'|tail -c +2|head -c 3
#4楼
遵循要求
我有一个带有x个字符的文件名,然后是一个五位数的序列,在两侧由单个下划线包围,然后是另一组x个字符。 我想使用5位数字并将其放入变量中。
我发现了一些可能有用的grep
方法:
$ echo "someletters_12345_moreleters.ext" | grep -Eo "[[:digit:]]+"
12345
或更好
$ echo "someletters_12345_moreleters.ext" | grep -Eo "[[:digit:]]{5}"
12345
然后使用-Po
语法:
$ echo "someletters_12345_moreleters.ext" | grep -Po '(?<=_)\d+'
12345
或者,如果您想使其恰好适合5个字符,请执行以下操作:
$ echo "someletters_12345_moreleters.ext" | grep -Po '(?<=_)\d{5}'
12345
最后,要将其存储在变量中,只需使用var=$(command)
语法。
#5楼
有点晚了,但我遇到了这个问题,发现了以下内容:
host:/tmp$ asd=someletters_12345_moreleters.ext
host:/tmp$ echo `expr $asd : '.*_\(.*\)_'`
12345
host:/tmp$
我用它来获得日期为%N的嵌入式系统的毫秒级分辨率:
set `grep "now at" /proc/timer_list`
nano=$3
fraction=`expr $nano : '.*\(...\)......'`
$debug nano is $nano, fraction is $fraction
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3146814