2

可能重复:
Sed/Awk 在文件中搜索和替换/插入文本

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

谢谢。

编辑

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

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

1 回答 1

7

选项 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.$$

生成名称。它比名称 from 更容易预测mktemp且安全性较低,尤其是在您以 root 身份运行时。$TMPDIR使用当前目录,就好像您有多个文件系统一样,也可能是一种智慧。

选项 2:GNU sed

如果您有 GNUsed并且没有符号链接或硬链接要处理,那么您可以使用它的-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进行处理。

于 2012-11-02T14:34:36.150 回答