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

时间:2012-11-17 14:35:17

标签: bash sed awk filenames

我在文件夹中有数千个带有编码天气信息的文件。对于每个文件,我需要添加带有控制字符的页眉和页脚。这不是问题,因为我在单独的文件中有页眉和页脚(在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测试了我自己的一些想法 - 但我无法找到任何合适的方法来实现这一点办法。所以,我希望得到一些帮助或提示如何继续。

3 个答案:

答案 0 :(得分:3)

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

<强>说明

  • 我只是使用连接和shell重定向
  • &&是一种捷径。这与if condition; then action; fi
  • 相同

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

使用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

    的内容之前打印第一行

    (详情:它读取第二行并追加到模式空间,触发r打印出header.txt的内容。之后,模式空间,现在由第1行和第2行组成,仅在周期结束时打印出来)

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