将标题添加到多个文本文件中

时间:2012-11-02 14:17:26

标签: bash command-line io

  

可能重复:
  Sed/Awk to search and replace/insert text in files

我想知道如何将一个“标题”行添加到一个目录中包含的多个文本文件中。 Bash命令行会很棒!

THX。

修改

我在这里找到了我的需求:http://perldoc.perl.org/index-faq.html享受! 这是我的答案:

perl -pi -e 'print "**MyHeaderText**\n" if $. == 1' *

1 个答案:

答案 0 :(得分:5)

选项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,QUIT,PIPE和TERM)下删除它。然后主循环将头字符串和文件复制到临时文件,并将临时文件移到原始文件上,删除任何剩余文件(如果出现问题)并取消清理,以便shell可以干净地退出。

如果您的原始文件有多个(硬)链接,或者它是符号链接,则会丢失这些特殊属性。要解决此问题,您必须使用cp $tmp $file,然后您还必须删除$tmp中的文件。

如果您没有mktemp命令,可以使用:

tmp=${TMPDIR:-/tmp}/ins.$$

生成名称。它比mktemp中的名称更容易预测,安全性更低,特别是如果您以root身份运行。如果您有多个文件系统,那么将当前目录用作$TMPDIR也可能是明智之举。

选项2:GNU sed

如果你有GNU sed并且没有符号链接或硬链接来处理,那么你可以使用它的-i选项来进行就地修改。

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:其他工具

还有许多其他可能的技术。例如,您可以使用edex来编辑文件。您可以使用Perl或Python或awk进行处理。