可能重复:
桑达/ awk来查找和替换/插入文件中的文本
我想知道如何添加一个“头”行成包含在一个目录中的多个文本文件。 bash命令行就太棒了!
谢谢。
编辑
我发现我需要在这里: http://perldoc.perl.org/index-faq.html享受! 下面是我的回答:
perl -pi -e 'print "**MyHeaderText**\n" if $. == 1' *
可能重复:
桑达/ awk来查找和替换/插入文件中的文本
我想知道如何添加一个“头”行成包含在一个目录中的多个文本文件。 bash命令行就太棒了!
谢谢。
编辑
我发现我需要在这里: http://perldoc.perl.org/index-faq.html享受! 下面是我的回答:
perl -pi -e 'print "**MyHeaderText**\n" if $. == 1' *
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和期限)。 然后,主循环副本的头部字符串和文件到临时,并且在原有的移动暂时的,删除任何剩余文件(万一出事了),并取消清理这样的外壳可以完全退出。
如果你的原始文件有多个(硬)链接,或者如果它是一个符号链接,你失去了这些特殊的性质。 为了解决这个问题,你必须使用cp $tmp $file
,然后你必须删除在文件$tmp
过。
如果你没有mktemp
COMAND,你可以使用:
tmp=${TMPDIR:-/tmp}/ins.$$
生成一个名称。 它是更容易比从名字预见mktemp
和安全性较低,尤其是当你以root身份运行。 也可能有使用当前目录作为智慧$TMPDIR
,如果你有多个文件系统。
如果你有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
,以避免在循环尴尬缩进。
还有许多其他可能的技术。 例如,你可以使用ed
或ex
编辑文件。 你可以使用Perl或Python或awk
做处理。