可能重复:
Sed/Awk 在文件中搜索和替换/插入文本
我想知道如何将一个“标题”行添加到一个目录中包含的多个文本文件中。Bash 命令行会很棒!
谢谢。
编辑
我在这里找到了我的需求:http: //perldoc.perl.org/index-faq.html享受!这是我的答案:
perl -pi -e 'print "**MyHeaderText**\n" if $. == 1' *
可能重复:
Sed/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 和 TERM)下将其删除。然后主循环将标题字符串和文件复制到临时文件,并将临时文件移到原始文件上,删除任何剩余文件(以防出现问题)并取消清理,以便 shell 可以干净地退出。
如果您的原始文件有多个(硬)链接,或者它是一个符号链接,您将失去这些特殊属性。要解决这个问题,您必须使用cp $tmp $file
,然后您也必须删除该文件$tmp
。
如果你没有mktemp
命令,你可以使用:
tmp=${TMPDIR:-/tmp}/ins.$$
生成名称。它比名称 from 更容易预测mktemp
且安全性较低,尤其是在您以 root 身份运行时。$TMPDIR
使用当前目录,就好像您有多个文件系统一样,也可能是一种智慧。
如果您有 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
以避免循环中尴尬的缩进。
还有许多其他可能的技术。例如,您可以使用ed
或ex
来编辑文件。您可以使用 Perl 或 Python 或awk
进行处理。