我想编写一个 Linux 脚本(set_compiler.sh
),它将在结束行之前添加一行。
文件zazzercode.gwt.xml
如下:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.3.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.3.0/distro-s ource/core/src/gwt-module.dtd">
3 <module rename-to="zazzercode">
4 <inherits name="com.google.gwt.user.User"/>
5 <inherits name="com.google.gwt.i18n.I18N" />
6 <inherits name="com.google.gwt.http.HTTP" />
7 <inherits name="com.google.gwt.json.JSON"/>
8
9 <inherits name="com.google.gwt.uibinder.UiBinder" />
10 <inherits name="com.google.gwt.inject.Inject" />
11 <inherits name="com.gwtplatform.mvp.Mvp" />
12 <inherits name="gwtquery.plugins.droppable.Droppable"/>
13
14 <source path="client" />
15 <source path="shared" />
16
17 <define-configuration-property name="gin.ginjector" is-multi-valued="false"/>
18 <set-configuration-property name="gin.ginjector" value="com.zazzercode.client.mvp.ZazzercodeGInjector"/>
19 <set-configuration-property name="UiBinder.useSafeHtmlTemplates" value="true" />
20
21 <extend-property name="locale" values="en" />
22 <set-property name="user.agent" value="safari" />
23 <set-property-fallback name="locale" value="en"/>
24
25 <entry-point class="com.zazzercode.client.MainApp"/>
26
27 </module>
当我发出$ set_compiler
命令时,脚本必须在结束行之前添加以下行。
<set-property name="user.agent" value="safari" />
类似于以下代码使用脚本。
sed -e '25a\ <set-property name="user.agent" value="safari" />' zazzercode.gwt.xml
答案1
文件中的内容如下test
:
Here
are
some
lines
以下命令给出以下输出:
$ NL=$(wc -l test); sed ${NL%% *}'iMYNEWLINE' test
Here
are
some
MYNEWLINE
lines
如果您的版本支持,请使用-i
with 来sed
就地编辑文件。
真正的“魔法”是sed
“ ”形式的命令#itext
,其中#
是行号,i
表示“插入”,text
是要插入的文本。在这里它将扩展为
sed '4iMYNEWLINE' test
我从 获得行数wc
。它以以下形式输出:
$ wc -l test
4 test
但我只需要数字,所以我使用 shell 括号扩展来清除与模式匹配的所有内容*
,即“空格,然后是任何内容”。这部分只是使用的一个怪癖wc
。
在我写这篇文章的时候,我看到你的编辑建议使用sed
大致相同的方式,所以我想我可以省去一些写作的时间 :-)。 在你的情况下,最终命令可以是例如:
FN="zazzercode.gwt.xml"; NL=$(wc -l "$FN"); sed -i ${NL%% *}'i\ <set-property name="user.agent" value="safari" />' "$FN"
请注意,我-i
在添加该开关之前已在不使用该开关的情况下测试了命令。
答案2
假设你的文件不是巨大的并且可以安全地将它们加载到内存中,您可以这样做,从而避免扫描文件两次(否wc
):
perl -e 'open($fh,"$ARGV[0]"); @a=<$fh>;
$a[$#a-1]="<set-property name=\"user.agent\" value=\"safari\" />\n" .
$a[$#a-1];
print "@a\n";
' zazzercode.gwt.xml > new_file
或者,对于仅使用 coreutil 工具的解决方案:
$ (head -n -2 zazzercode.gwt.xml;
echo "<set-property name="user.agent" value="safari" />";
tail -n 1 zazzercode.gwt.xml) > new_file