可能的重复:
sed/awk搜索和替换/插入文件中的文本
我想知道如何在一个目录中包含的多个文本文件中添加一条"标头"行。bash命令行很棒!
thx。
edit
我在这里找到了我的需求:http://perldoc.perl.org/index-faq.html享受!这是我的答案:
perl -pi -e 'print "**MyHeaderText**n" if $. == 1' *
选项1:几乎可以使用Unix的任何版本
tmp=$(mktemp) # Create a temporary file
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
header="This is the header line to be inserted"
for file in "$@"
do
{
echo "$header"
cat $file
} > $tmp
mv $tmp $file
done
rm -f $tmp
trap 0
这可以安全地创建一个临时文件,并确保在合理的信号集合(HUP,INT,戒烟,管道和期限)下将其删除。然后,主循环将标头字符串和文件复制到临时性,然后将临时性移到原始文件上,将删除所有剩余文件(如果出现问题出现)并取消清理,以便外壳可以干净地退出。
>如果您的原始文件具有多个(硬)链接,或者是符号链接,则将失去这些特殊属性。要解决此问题,您必须使用cp $tmp $file
,然后也必须在$tmp
中删除文件。
如果您没有mktemp
COMAND,则可以使用:
tmp=${TMPDIR:-/tmp}/ins.$$
生成一个名称。它比mktemp
的名称更容易预测,并且不太安全,尤其是当您作为root运行时。如果您有多个文件系统,则可能会有智慧将当前目录用作$TMPDIR
。
选项2:gnu sed
如果您有GNU sed
,并且没有符号链接或硬链接可以处理,那么您可以使用其-i
选项进行现场Alter。
header="This is the line to be inserted"
for file in "$@"
do
sed -i -e "1i
$header" $file
done
这将在每个文件的第一行之前插入$header
的值。您可以将编辑脚本写入文件中,并使用sed -i -f sed.script $file
避免循环中的尴尬凹痕。
选项3:其他工具
还有许多其他可能的技术。例如,您可以使用ed
或ex
编辑文件。您可以使用Perl或Python或awk
进行处理。