Eri*_*ric 2 io bash command-line
可能重复:
Sed / Awk搜索和替换/插入文件中的文本
我想知道如何将一个“标题”行添加到一个目录中包含的多个文本文件中。Bash命令行很棒!
谢谢。
编辑
我在这里找到了我的需求:http : //perldoc.perl.org/index-faq.html尽情享受!这是我的答案:
perl -pi -e 'print "**MyHeaderText**\n" if $. == 1' *
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这样可以安全地创建一个临时文件,并确保在合理的信号收集(HUP,INT,QUIT,PIPE和TERM)下将其删除。然后,主循环将标头字符串和文件复制到临时文件,并将临时文件移到原始文件上,删除所有剩余的文件(以防万一出错)并取消清理,以便外壳可以干净地退出。
如果您的原始文件具有多个(硬)链接,或者它是一个符号链接,则会丢失这些特殊属性。要解决此问题,您必须使用cp $tmp $file,然后也必须删除其中的文件$tmp。
如果没有mktemp命令,可以使用:
tmp=${TMPDIR:-/tmp}/ins.$$
Run Code Online (Sandbox Code Playgroud)
产生一个名字。它比名称的名称更容易预测,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
Run Code Online (Sandbox Code Playgroud)
这将在$header每个文件的第一行之前插入的值。您可以将编辑脚本写入文件中,并用于sed -i -f sed.script $file避免循环中的尴尬缩进。
还有许多其他可能的技术。例如,您可以使用ed或ex编辑文件。您可以使用Perl或Python或awk进行处理。