У меня есть файл 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 и попытался найти ответ в других местах, но не очень удачно.
Использование команды 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
).