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

Bash 需要使用脚本更改文件内容,但保留原始文件名,bash,sed,awk,filenames,Bash,Sed,Awk,Filenames,我在一个文件夹里有几千个带有编码天气信息的文件。对于每个文件,我需要添加一个带有控制字符的页眉和页脚。这不是问题所在,因为页眉和页脚位于不同的文件中(通过bash脚本中的cat命令实现) 但是,修改后的文件需要保留其原始名称-这给我带来了一个问题,因为我只有非常基本的脚本知识。保留它们的原因是这些文件将被解析和解码。文件名包含解码器如何处理内容的重要信息 所有要解码的文件都在一个单独的文件中,list\u of_files\u to_decode.txt 文件夹内容的一部分可以如下所示: a_s

我在一个文件夹里有几千个带有编码天气信息的文件。对于每个文件,我需要添加一个带有控制字符的页眉和页脚。这不是问题所在,因为页眉和页脚位于不同的文件中(通过bash脚本中的
cat
命令实现)

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

所有要解码的文件都在一个单独的文件中,
list\u of_files\u 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  
我查看了网络,并测试了我自己的一些想法——使用
awk
sed
——但我真的找不到任何合适的方法来轻松实现这一点。因此,我希望您能提供一些关于如何继续的帮助或提示。

而IFS=read-r file;做
while IFS= read -r file; do
    cat header.txt "$file" footer.txt > newfile && mv newfile "$file"
done < list_of_files_to_decode.txt
cat header.txt“$file”footer.txt>newfile&&mv newfile“$file” 完成<从\u文件列表\u到\u decode.txt
解释

  • 我只是使用连接和shell重定向
  • &&
    是一种快捷方式。这与
    if条件相同;然后行动;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
      
      OLDIFS=$IFS;IFS=$'\n'
      sed-i'1 r header.txt
      1N
      
      $r footer.txt'$(这比我预想的还要简单。我已经测试过了,效果很好。非常感谢。除非你有很好的明确理由,否则请始终引用变量。
      mv$file$file.orig
      mv“$file”“${file}.orig”非常不同
      这几乎肯定不是您想要的。
      +1
      相应地添加了
      ;-)
      对于带有反斜杠的文件名和以空格开头或结尾的文件名,可能会失败,并且可能存在其他不寻常的情况。当IFS=read-r变量时,总是将while-read循环写为
      ,而不仅仅是
      while-read变量
      。IFS=负责以空格开头或结尾的文件名,-r负责包含反斜杠的文件名。对于包含换行符的文件名,它仍然会失败,但有一点……当您控制输入文件和内容时,它不是必需的,但会相应地进行后期编辑,以获得更通用的可重用代码段。除非您有非常明确的理由,否则请始终引用您的变量。IFS=$OLDIFS与IFS=“$OLDIFS”非常不同,几乎可以肯定这不是您想要的。除非涉及到命令替换,否则不会在赋值时发生分词。这不仅仅是您需要担心的分词(请参阅),但看起来您是对的,在赋值中,不带引号的变量是安全的。我以前从来没有注意到这一点,因为我总是引用我的变量,除非我有非常具体的理由不这样做。避免在其他时候感到惊讶。