sed не может вставить, если файл заканчивается пустой строкой

У меня есть файл uca.xml (конфигурация Thunar для пользовательских действий):




    


<--blank line here-->

Учтите, что файл заканчивается пустой строкой

Мне нужна команда/скрипт bash для вставки файла customAction. txt, содержащий:


    

так что в итоге это будет выглядеть так:




    


    


Я попробовал метод, данный jfgagne:

sed -n -i -e '//r customAction. txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml

но это работает только если под тегом вставлен хотя бы один символ (не пустая строка).

Моим временным обходным решением является скрипт:

echo "someDummyText" >> uca.xml
sed -n -i -e '/<\/actions>/r customaction.txt' -e 1x -e '2,${x;p}' -e '${x;p}' uca.xml
sed -i 's/someDummyText//' uca.xml
sed -i '${/^$/d;}' uca.xml

но я считаю, что есть более элегантное, однострочное решение с помощью sed. Заранее спасибо.

Примечание: это мой первый пост в сообществе U&L и StackExchange, поэтому, пожалуйста, будьте снисходительны ко мне и не стесняйтесь многословно поправлять меня, если я сделал что-то не так. Я прочитал FAQ по SE и попытался найти ответ в других местах, но не очень удачно.

0
13.04.2017, 15:36
1 ответ

Использование команды sedчтение(r):

$ sed '\#</action>#r customAction.txt' uca.txt
<?xml encoding="UTF-8" version="1.0"?>
<actions>
<action>
    <!--some code-->
</action>
<action>
    <!--custom configuration-->
</action>
</actions>

В конце входного файла есть пустая строка, и она сохраняется в выходных данных. Команда rвставит содержимое данного файла после нахождения данного шаблона. Это работает, как и ожидалось, для данных примера, потому что единственное вхождение строки </action>. Если бы во входном файле было больше ранее -существующих действий, это не сработало бы должным образом.

Следующее будет работать с файлом, содержащим несколько действий:

gsed -e '\#</actions>#d' -e '$ r customAction.txt' -e '$ a\</actions>' uca.txt

Он удаляет тег </actions>при обнаружении и вставляет содержимое customAction.txtв конце. Затем он добавляет </actions>после этого.

Этот способ написания команды aтребует GNU sed(, поэтомуgsed).

0
28.01.2020, 04:51

Теги

Похожие вопросы