需要使用脚本更改文件内容,但保留原始文件名



我在一个文件夹中有数千个包含编码天气信息的文件。对于每个文件,我需要添加一个带有控制字符的页眉和页脚。这不是问题,因为我将页眉和页脚放在单独的文件中(使用 bash 脚本中的 cat 命令实现)。

但是,修改后的文件需要保留其原始名称 - 这给了我一个问题,因为我只有非常基本的脚本知识。保留它们的原因是这些文件将被解析和解码。文件名包含解码器如何处理内容的重要信息。

所有要解码的文件都在单独的文件中,list_of_files_to_decode.txt .

文件夹内容的一部分可能如下所示:

a_snvs02wiix170600_c_eswi_20121117062131_76.txt
a_smci40babj170600_c_kwbc_20121117061545_3.txt
a_sath40vtbb170600_c_ekmi_20121117061604_95.txt
a_usxx40mynn70600cca_c_edzw_20121117062020_34.txt
a_siin40dems170600_c_ojam_20121117062020_40.txt
a_smxx40fapr170600rra_c_lowm_20121117062604_67.txt    
list_of_files_to_decode.txt   
start-seq.txt    
stop-seq.txt  

我已经检查了网络,并使用awksed测试了我自己的一些想法,但我真的找不到任何合适的方法来轻松实现这一目标。因此,我将不胜感激有关如何进行的一些帮助或提示。

while IFS= read -r file; do
    cat header.txt "$file" footer.txt > newfile && mv newfile "$file"
done < list_of_files_to_decode.txt

解释

  • 我只是使用串联和外壳重定向
  • &&是捷径。这与if condition; then action; fi相同

唯一安全的方法是先重命名原始文件

mv $file $file.orig
cat header $file.orig footer > $file && rm $file.orig

反之亦然,创建一个新文件,然后覆盖原始文件

cat header $file footer > $file.new && mv -f $file.new $file

sed的无循环方式:

OLDIFS=$IFS; IFS=$'n'
sed -i '1 r header.txt
        1 N
        $ r footer.txt' $(<list_of_files_to_decode.txt)
IFS=$OLDIFS


笔记:
  • 仅当文件名中有空格时,才将IFS设置为换行
  • r 在读取下一行时打印文件内容
  • 1 N防止在header.txt内容之前打印第一行

    (详细信息:它读取第 2 行并附加到图案空间,触发r打印出header.txt的内容。之后,现在由第 1 行和第 2 行组成的图案空间仅在循环结束时打印出来)

  • 当然,如果您使用的是脚本,则可能不需要备份和重置IFS

相关内容

  • 没有找到相关文章

最新更新