如何通过更改为相同文件来插入文件名?

如何通过更改为相同文件来插入文件名?

我有很多文件。文件格式为年(4 位数字)月(2 位数字)日(2 位数字)

示例文件名:

  • 20150101.txt
  • 20150102.txt

示例文件名的内容

00:00:13 -> 001528

我想从文件名中提取日期数据,然后将其插入文件中

期望输出

2015-01-01T00:00:13 001528

或者

2015-01-01 00:00:13 001528

我尝试了下面的代码之一

for files in *txt; do
awk -F "->" 'BEGIN{OFS=""} {print FILENAME" ",$1, $2}' <$files > $files.edited
mv $files.edited $files
done

请指导。

答案1

如果你有 GNU awk ( gawk),那么你可以使用它的内置时间函数将文件名和内容的片段转换为纪元时间,然后根据所选格式进行转换。

例如给定

$ cat 20150101.txt 
00:00:13 -> 001528

然后

$ awk -F ' -> ' '
    split($1,a,/:/) {
      ds = sprintf("%04d %02d %02d %02d %02d %02d", substr(FILENAME,1,4), substr(FILENAME,5,2), substr(FILENAME,7,2), a[1], a[2], a[3]); 
      $1 = strftime("%FT%T", mktime(ds))
    } 
    1
  ' 20150101.txt 
2015-01-01T00:00:13 001528

答案2

这将为您提供所需的输出sed

for files in *.txt; do
sed -e "s/^./$files&/;s/./&-/4;s/./&-/7;s/.txt/T/;s/ -> / /" "$files"
done

要将每个输出实际插入到每个文件中,您不需要像在循环中那样重定向。您只需使用选项-i而不是即可-e

  • s (替代)命令使用以下语法:s/regexp/replacement/flags
  • .匹配任意字符,并且^.匹配一行的第一个字符
  • & 反向引用模式空间的整个匹配部分
  • s/^./$files&/说用第一个字符之前的文件名替换第一个字符
  • s/./&-/4使用数字标志 4将第 4 个字符( 的第 4 个匹配项.)替换为-第 4 个字符之后的
  • s/./&-/7-第 7 个字符之后替换第 7 个字符(注意,在-第 4 个字符之后插入后,第 6 个字符变为第 7 个字符)。

而且当然,

  • s/.txt/T/替换.txtT
  • s/ -> / /->用一个空格替代。

这是输出:

2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528

相关内容