Bash 需要使用脚本更改文件内容,但保留原始文件名
我在一个文件夹里有几千个带有编码天气信息的文件。对于每个文件,我需要添加一个带有控制字符的页眉和页脚。这不是问题所在,因为页眉和页脚位于不同的文件中(通过bash脚本中的Bash 需要使用脚本更改文件内容,但保留原始文件名,bash,sed,awk,filenames,Bash,Sed,Awk,Filenames,我在一个文件夹里有几千个带有编码天气信息的文件。对于每个文件,我需要添加一个带有控制字符的页眉和页脚。这不是问题所在,因为页眉和页脚位于不同的文件中(通过bash脚本中的cat命令实现) 但是,修改后的文件需要保留其原始名称-这给我带来了一个问题,因为我只有非常基本的脚本知识。保留它们的原因是这些文件将被解析和解码。文件名包含解码器如何处理内容的重要信息 所有要解码的文件都在一个单独的文件中,list\u of_files\u to_decode.txt 文件夹内容的一部分可以如下所示: a_s
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”非常不同,几乎可以肯定这不是您想要的。除非涉及到命令替换,否则不会在赋值时发生分词。这不仅仅是您需要担心的分词(请参阅),但看起来您是对的,在赋值中,不带引号的变量是安全的。我以前从来没有注意到这一点,因为我总是引用我的变量,除非我有非常具体的理由不这样做。避免在其他时候感到惊讶。