使用 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 模式同样有效。
正如您使用 bash 标记的那样,如果您愿意,可以使用 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
我知道以前也有人问过类似的问题,但我一直无法真正了解所发布的内容。
我有一大堆文件在文件名中的某个位置包含格式为 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 模式同样有效。
正如您使用 bash 标记的那样,如果您愿意,可以使用 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