如何在 shell 脚本中提取字符串
How to extract string in shell script
我有像 Tarun_Verma_25_02_2016_10_00_10.csv
这样的文件名。如何在 shell 脚本中从中提取 25_02_2016_10_00_10
之类的字符串?
"firstName"_"lastName"
后面有多少个数字部分未确认
首选单行解决方案。
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 时,即使对于大输入也相当快)。
如果你想控制你挑选的部分(假设格式总是像 <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 ,,,,,}'
这里awk
同时用下划线和句点分割,设置Output Field Seperator为下划线,然后打印你感兴趣的文件名部分。
和sed
$ echo Tarun_Verma_25_02_2016_10_00_10.csv | sed -r 's/[^0-9]*([0-9][^.]*)\..*//'
25_02_2016_10_00_10
提取第一个数字和点之间的所有内容。
我有像 Tarun_Verma_25_02_2016_10_00_10.csv
这样的文件名。如何在 shell 脚本中从中提取 25_02_2016_10_00_10
之类的字符串?
"firstName"_"lastName"
后面有多少个数字部分未确认首选单行解决方案。
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 时,即使对于大输入也相当快)。
如果你想控制你挑选的部分(假设格式总是像 <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 ,,,,,}'
这里awk
同时用下划线和句点分割,设置Output Field Seperator为下划线,然后打印你感兴趣的文件名部分。
和sed
$ echo Tarun_Verma_25_02_2016_10_00_10.csv | sed -r 's/[^0-9]*([0-9][^.]*)\..*//'
25_02_2016_10_00_10
提取第一个数字和点之间的所有内容。