使用 bash 脚本从文件名中提取日期

Extract date from filename using bash script

我知道以前也有人问过类似的问题,但我一直无法真正了解所发布的内容。

我有一大堆文件在文件名中的某个位置包含格式为 YYYYMMDD 的日期。幸运的是,这是所有文件名中唯一的 8 位子字符串!

稍后我需要将日期写入另一个文件,但这应该没问题。我正在努力首先将日期提取到变量中...

我知道我可以用 grep 得到它:

for d in $( ls *.csv | grep -Po "\d{8}"; do 
echo $d done

但是,因为我想在遍历它们时也将完整的文件名放入变量中,所以现在不可行。

我尝试过使用 sed,但我不认为我知道如何使用它:

for f in $( ls *.csv ); do
    d=$( $f | sed -e 's/^.*\(\d{8}\).*$')
    echo $d
done

感谢您为我指明正确的方向!

像这样遍历你的 csv 文件(不解析 ls):

for f in *.csv; do
    echo "$f"
    d=$(echo "$f" | grep -oE '[0-9]{8}')
done

我在扩展模式下使用过 grep (-E),但 perl 模式同样有效。

正如您使用 标记的那样,如果您愿意,可以使用 d=$(grep -oE '[0-9]{8}' <<<"$f" 代替。您还可以使用内置的正则表达式支持,它稍微冗长但可以节省调用外部工具的时间:

re='[0-9]{8}'
[[ $f =~ $re ]] && d="${BASH_REMATCH[0]}"

数组BASH_REMATCH 包含正则表达式的匹配项。如果有匹配项,我们将其分配给 d.

#!/bin/bash
#      ^-- important: bash, not not /bin/sh

for f in *.csv; do                       # Don't use ls for iterating over filenames
  [[ $f =~ [[:digit:]]{8} ]] && {        # native built-in regex matching
    number=${BASH_REMATCH[0]}            # ...refer to the matched content...
    echo "Found $number in filename $f"  # ...and emit output.
  }
done