什么是最简单的方法来提取Unix shell(使用正则expression式)的子string?
简单的手段:
更新
我意识到正则expression式本身与简单性是相冲突的,我select了最简单的一个作为select的答案。 我很抱歉模糊的问题。 我更改标题以更准确地表示此QA的当前状态。
cut可能是有用的:
$ echo hello | cut -c1,3 hl $ echo hello | cut -c1-3 hel $ echo hello | cut -c1-4 hell $ echo hello | cut -c4-5 lo
Shell Builtins也适合这个,下面是一个示例脚本:
#!/bin/bash # Demonstrates shells built in ability to split stuff. Saves on # using sed and awk in shell scripts. Can help performance. shopt -o nounset declare -rx FILENAME=payroll_2007-06-12.txt # Splits declare -rx NAME_PORTION=${FILENAME%.*} # Left of . declare -rx EXTENSION=${FILENAME#*.} # Right of . declare -rx NAME=${NAME_PORTION%_*} # Left of _ declare -rx DATE=${NAME_PORTION#*_} # Right of _ declare -rx YEAR_MONTH=${DATE%-*} # Left of _ declare -rx YEAR=${YEAR_MONTH%-*} # Left of _ declare -rx MONTH=${YEAR_MONTH#*-} # Left of _ declare -rx DAY=${DATE##*-} # Left of _ clear echo " Variable: (${FILENAME})" echo " Filename: (${NAME_PORTION})" echo " Extension: (${EXTENSION})" echo " Name: (${NAME})" echo " Date: (${DATE})" echo "Year/Month: (${YEAR_MONTH})" echo " Year: (${YEAR})" echo " Month: (${MONTH})" echo " Day: (${DAY})"
输出:
Variable: (payroll_2007-06-12.txt) Filename: (payroll_2007-06-12) Extension: (txt) Name: (payroll) Date: (2007-06-12) Year/Month: (2007-06) Year: (2007) Month: (06) Day: (12)
而根据上面的Gnudif,总是会有sed / awk / perl,当这个进程变得非常艰难的时候。
Unix shell通常不具有内置的正则expression式支持。 Bash和Zsh都这样做,所以如果使用=~运算符来比较string和正则expression式,那么:
您可以从bash中的$BASH_REMATCH数组中获取子string。
在Zsh中,如果设置了BASH_REMATCHshell选项,那么值在$BASH_REMATCH数组中,否则它在$MATCH/$match绑定的variables对中(一个标量,另一个是数组)。 如果设置了RE_MATCH_PCRE选项,则使用PCRE引擎,否则使用系统正则expression式库,以便按照bash扩展正则expression式语法匹配。
所以,最简单的:如果你使用bash:
if [[ "$variable" =~ unquoted.*regex ]]; then matched_portion="${BASH_REMATCH[0]}" first_substring="${BASH_REMATCH[1]}" fi
如果您不使用Bash或Zsh,则需要使用外部命令才会变得更加复杂。
grep和sed可能是你想要的工具,取决于文本的结构。
sed应该做的伎俩,如果你不知道子串是什么,但知道它周围的一些模式。
例如,如果您想要查找以“#”符号开头的数字的子string,则可以编写如下所示的内容:
sed 's/^.*#\([0-9]\+\)/\1/g' yourfile
grep可以做类似的事情,但问题是你需要做什么与子string,是否我们正在谈论普通的行结束分隔文本或不。