Я хочу написать скрипт 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     

2 ответа2

3

Со следующим содержимым в test файла:

Here
are
some
lines

следующая команда дает следующий вывод:

$ NL=$(wc -l test); sed ${NL%% *}'iMYNEWLINE' test
Here
are
some
MYNEWLINE
lines

Используйте -i с sed если ваша версия поддерживает его для редактирования файла на месте.

Настоящая "магия" - это команда sed в форме « #itext », где # - номер строки, i обозначает "вставить", а text - текст для вставки. Здесь он будет расширяться до

sed '4iMYNEWLINE' test

Я получаю количество строк от wc . Это дает вывод на форму:

$ wc -l test
4 test

но мне нужно только число, поэтому я использую расширение в скобках, чтобы очистить все, что соответствует шаблону * , то есть "пробел и затем все". Эта часть просто причуда от использования wc .


Пока я пишу, я вижу ваше редактирование, которое предлагает использовать sed более или менее точно таким образом, так что я мог бы сэкономить некоторые записи, я думаю :-). В вашем случае последняя команда может быть, например:

FN="zazzercode.gwt.xml"; NL=$(wc -l "$FN"); sed -i ${NL%% *}'i\ <set-property name="user.agent" value="safari" />' "$FN"

Обратите внимание, что я включил -i: протестировать команду без нее перед добавлением этого параметра.

1

Предполагая, что ваши файлы не очень большие, и вы можете безопасно загрузить их в память, вы можете сделать это, чтобы избежать сканирования файла дважды (без 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .