linux - 在结束行之前添加一行

linux - 在结束行之前添加一行

我想编写一个 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

如果您的版本支持,请使用-iwith 来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

相关内容