正则表达式,用于选择除特定字符外的前N个字符

时间:2016-06-01 16:59:55

标签: regex bash sed

我在目录中有许多脚本,格式为120100_0019_0_X0434147_script_name.sql

我只需要选择前11个数字(不包括下划线)

对于上面的脚本,我需要的结果是12010000190

我可以通过使用以下行获得结果,但我希望有人可以解释如何使用更短的代码或仅使用sed来实现此结果。

echo "$SCRIPT" | cut -c 1-13 | sed 's/_//g'

3 个答案:

答案 0 :(得分:1)

bash only approach:

$ script=120100_0019_0_X0434147_script_name.sql

$ script1=${script//_/} # Remove all _
$ script1=${script1:0:11} #Take first 11 characters
$ echo $script1
12010000190

OR

$ script1=${script//_/} # Remove all _
$ script1=${script1/X*/} # Remove everything starting from X
$ echo $script1
12010000190

OR

$ script1=${script//_/} # Remove all _
$ script1=${script1/[^0-9]*/} # Remove everything starting from first non-numeric character.
$ echo $script1
12010000190

答案 1 :(得分:0)

你可以这样做

echo '120100_0019_0_X0434147_script_name.sql' | sed -r 's/_//g; s/(^[0-9]{11}).*/\1/'

首先删除' _'然后选择前11位数字,忽略该行的其余部分。

答案 2 :(得分:0)

如果没有正则表达式,您可以写:

echo "${SCRIPT::13}" | tr -d _