如何使用sed结合date生成的年内日序变量读取TXT文件对应行
按年内日数定位TXT指定行的实现方法
现有脚本的两处关键错误
- 变量赋值逻辑错误:
dat= date +%j的写法只会临时给date命令传入一个空值的dat环境变量,根本不会把date的执行结果保存到dat变量中。正确的命令输出赋值需要使用$()格式的命令替换语法。 - sed参数的引号使用错误:单引号包裹的内容不会触发bash的变量展开,就算把
1p换成$datp放在单引号里,bash也不会解析这个变量,只会把它当成纯文本传给sed。要传入变量拼接的行号参数,必须用双引号包裹sed的命令段。
修正后的可运行脚本
#!/usr/bin/bash # 获取当前是年内第几日 dat=$(date +%j) # 按dat对应的行号读取文件内容 arg=$(sed -n "${dat}p" /home/adam/dailyverses.txt) # 输出读取到的内容 echo "$arg"
运行逻辑说明
- 执行时bash会先把
$dat替换成date +%j返回的数字(比如当前是年内第128天,就会替换成128) - 最终传给sed的参数就是
128p,和手动写固定行号的打印效果完全一致 - 去掉了原脚本里多余的
cat管道步骤,sed本身支持直接读取目标文件路径,减少不必要的进程开销
注意:如果碰到闰年场景,
date +%j在2月29日会返回值60,只要你的dailyverses.txt总行数不小于当年的年内最大日数(平年365、闰年366),脚本就能正常运行。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

