如何在shell脚本中提取字符串

时间:2016-02-25 18:17:09

标签: linux shell unix sh ksh

我有<link rel="stylesheet" type="text/css" href="select2/select2.min.css" /> <script src="select2/select2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $(".selecte").select2(); maximumSelectionLength: 15; }); </script> 这样的文件名。如何在shell脚本中从中提取Tarun_Verma_25_02_2016_10_00_10.csv之类的字符串?

未确认“firstName”_“lastName”

之后会有多少数字部分

首选单线解决方案。

3 个答案:

答案 0 :(得分:2)

sed

$ echo Tarun_Verma_25_02_2016_10_00_10.csv | sed -r 's/[^0-9]*([0-9][^.]*)\..*/\1/'

25_02_2016_10_00_10

提取第一个数字和点之间的所有内容。

答案 1 :(得分:1)

如果你想控制你挑选的部分(假设格式总是像<firstname>_<lastname>_<day>_<month>_<year>_<hour>_<minute>_<second>.csv那样)awk会非常方便

 echo "Tarun_Verma_25_02_2016_10_00_10.csv" | awk -F"[_.]" 'BEGIN{OFS="_"}{print $3,$4,$5,$6,$7,$8}'

此处awk按下划线和句点分割,将输出字段分隔符设置为下划线,然后打印您感兴趣的文件名部分。

答案 2 :(得分:0)

ksh93支持语法bash调用extglobs开箱即用。因此,在ksh93中,您可以执行以下操作:

f='Tarun_Verma_25_02_2016_10_00_10.csv'
f=${f##+([![:digit:]])} # trim everything before the first digit
f=${f%%+([![:digit:]])} # trim everything after the last digit
echo "$f"

要在bash中执行相同的操作,您需要先运行以下命令

shopt -s extglob

由于它使用shell本地字符串操作,因此在处理仅一行输入时,它比调用外部命令(sed,awk等)运行得快得多。 (当使用ksh93而不是bash时,即使对于大输入也是如此)。