您好,我目前正在尝试执行以下代码。我在变量 DATE 中存储了一个字符串,其格式为 YYYY/MM/DD。我尝试使用 cut 命令提取年份。我收到一条错误消息,指出它不是文件或目录。我可以进行修改或采取不同的方法吗?
for file in ~/filesToSort/*
do
DATE=$(head -1 $file | tr "-" "/")
echo "${DATE}"
YYYY=$(cut -c1-4 accounts $DATE)
#echo "${YYYY}"
done
谢谢
答案1
该cut
实用程序从其标准输入流读取数据,它不会对作为参数给出的字符串进行操作。
因此,要使用cut
,您需要在标准输入上传递数据:
YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )
然而,这在循环中会非常慢。相反,使用内置参数替换来删除字符串/
中第一个之后的所有内容$DATE
:
YYYY=${DATE%%/*}
$DATE
这会删除与shell 模式匹配的最长后缀字符串/*
。如果字符串是2021/10/21
,则返回2021
。
获取目录中每个文件的前四个字符(这是我的本质相信您当前的代码正在尝试执行此操作),您可以sed
像这样使用:
for name in "$HOME"/filesToSort/*; do
sed -e 's/\(....\).*/\1/' -e q "$name"
done
这会读取每个文件的第一行,用该行的前四个字符替换该行的内容,然后将结果输出到终端后退出。
答案2
如果您的 shell 支持,您可以使用 Here Strings ( <<<
) 来实现此目的。从man bash
:
Here Strings
A variant of here documents, the format is:
[n]<<<word
The word undergoes tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and quote removal. Path‐
name expansion and word splitting are not performed. The result is
supplied as a single string, with a newline appended, to the command
on its standard input (or file descriptor n if n is specified).
在你的情况下,你会这样做:
for file in ~/filesToSort/*
do
date=$(head -1 "$file" | tr "-" "/")
echo "${DATE}"
yyy=$(cut -c1-4 <<< "$date")
echo "$yyy"
done
答案3
使用好 ole 的另一种方法awk
for file in *; do
awk -F'-' 'NR==1 {print $1}' $file
done
-F '-'
告诉 awk 使用 the-
作为分隔符NR==1
告诉 awk 仅读取每个文件的第一行{print $1}
只打印由分隔符分隔的第一个字段