Remplazo будьте с переменными

Он нуждался бы в том, чтобы заменить переменную в файле и сколько бы я это не попробовал с sed я не достигаю цели.

Я выдвигаю сцену.

Я считаю файл config.xml следующим:

   <widget id="com.example.hello" version="0.0.1">
    <name>HelloWorld</name>
    <description>
        A sample Apache Cordova application that responds to the deviceready event.
    </description>
    <author email="dev@callback.apache.org" href="http://cordova.io">
        Apache Cordova Team
    </author>
     <enter>PASSWORD</enter>
    <content src="index.html" />
    <access origin="*" />
</widget>

Он нуждался бы в том, чтобы выполнить shell рукописный шрифт, который брал стоимость с той же команды, и заменить это, пример.

$./script.sh config.xml NUEVOPASSWORD

И так получать:

<widget id="com.example.hello" version="0.0.1">
<name>HelloWorld</name>
<description>
    A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@callback.apache.org" href="http://cordova.io">
    Apache Cordova Team
</author>
 <enter>NUEVOPASSWORD</enter>
<content src="index.html" />
<access origin="*" />

А именно, что изменил стоимость в этикетке <enter> с данным параметром.

Стоимость изменчивая а следовательно я это не узнаю, когда я буду выполнять рукописный шрифт.

1
задан 04.01.2017, 16:52
3 ответа

Чтобы изменять файлы XML лучше использовать инструмент ad-hoc, так как parsearlos он может давать проблемы.

Полезный инструмент xmlstarlet, с той, которая ты можешь говорить вещи как:

xmlstarlet ed -u "//enter" -v 'NUEVAPASSWORD' archivo

Здесь, он поддерживает файл, как измени контент tag <enter>:

<enter>NUEVAPASSWORD</enter>

По умолчанию xmlstarlet покажи из-за экрана результат изменений. Если то, что ты хочешь, состоит в том, чтобы изменять первоначальный файл, добавь выбор -L:

xmlstarlet ed -L -u "//enter" -v 'NUEVAPASSWORD' fichero
1
ответ дан 24.11.2019, 12:39
  • 1
    Превосходный opció n, когда xmlstarlet está доступный. Я это modificarí в для того, чтобы tag, чтобы изменять, был configurable comó показал автор вопроса в aclaració n. В любом случае +1. – Jose Antonio Reinstate Monica 04.01.2017, 17:52

Чтобы заменять цепи, используй sed -i 's/ORIGINAL/NUEVA/' archivo В конкретном случае, который ты показываешь, он был бы:

sed -i 's/>PASSWORD</>NUEVAPASSWORD</' config.xml

Поскольку ты будешь видеть, я включил символы > и <, чтобы гарантировать совпадение; они составили бы часть слов, которую было бы нужно искать / заменять, не команды.

0
ответ дан 24.11.2019, 12:39
  • 1
    Olvidé комментировать важную информацию, стоимость < enter> он изменчивый, из-за которого не conoceré когда будет выполнять рукописный шрифт следовательно этот метод не valdrí в, спасибо за ответ. – Jose Torres 11.11.2016, 16:41

У меня есть она soluciГіn и я помещаю ее, если бы кто-то находился в одной situaciГіn сходно.

$ cat script.sh
#!/bin/sh
file=$1
sed -i "s/^\( *<enter>\)\([^>]*\)</\1$2</" "$1"

И она ejecuciГіn полной команды serГ - в такой, что asГ-:

$./script.sh config.xml NEWPASSWORD

В моем случае функционирует верно.

0
ответ дан 24.11.2019, 12:39

Следующий рукописный шрифт the bash изменяет password:

#!/usr/bin/env bash
#Modifica un texto de la forma <$1>texto</$1>
#Dejándolo con la forma <$1>$2</$1>
#El tercer parámetro es el archivo a modificar.
#Por ejemplo, si se invoca este script con esta línea de comandos :
#modifica.sh enter NEWPASSWORD config.xml
#contra un archivo que contiene la línea : <enter>PASSWORD</enter>
#esta línea será cambiada a :    <enter>NEWPASSWORD</enter>
sed -i.BAK 's@\(<'"$1"'>\).\+\(</'"$1"'>\)@\1'"$2"'\2@' "$3"

Как функционирует эта команда будьте?
'' это, чтобы избегать того, чтобы bash он интерпретировал контент и прошел такой который текст в жажду.
"" они для параметров $1 и $2 с которым нужно призывать в рукописный шрифт. $1 это tag (enter в примере) и $2 это новый password. Я использую "" потому что да я хочу, чтобы bash он интерпретировал их, и чтобы избегать того, чтобы место на мишень разделило цепь.

s : Я командую искания и замены.
@ : Разделитель параметров команды s, обычное состоит в том, чтобы использовать /, но текст, который нужно обрабатывать, содержит / с которым оно не функционировало бы, и будьте позволь использовать любой символ как разделитель команды s. Заметьте себе, что, если новый password содержит @ это не будет функционировать. Нужно использовать символ, который не появлялся бы. То, что следует за этим, так это регулярное выражение текста, которое нужно искать.
\( : Начало группы задержания. Все то, что пойдет отсюда даже) будет храниться в \1.
<$1> : Parsear указанный tag.
\) : Конец группы задержания.
.+ : 1 или более символы. Если пароли размера 0 приемлемые использовать.*
\( : Начало группы задержания \2
</$1> : Parsear завершение указанного tag.
\) : Конец группы задержания.
@ : Разделитель параметров команды в. то, что следует за этим, так это текст, который заменит того, который совпадет с предыдущим регулярным выражением.
\1 : Группа задержания 1. Это пишет открытие tag.
$2 : Новый password.
\2 : Группа задержания 2. Это пишет завершение tag.
@ : Конец команды в.

1
ответ дан 03.12.2019, 19:13
  • 1
    Использовать sed, чтобы изменять XML - достаточно frá gil. Лучше использовать XML parser. –  04.01.2017, 17:25
  • 2
    @fedorqui в общем así он. Для этого случая в частности это достаточно. С преимуществом, которого будьте está установленный по умолчанию во многих системах и xmlstarlet не. Но если xmlstarlet está доступный я tambié n usarí в. –  04.01.2017, 17:52
  • 3
    Nó tese конечно, что, если ты используешь -r не necesitará s убегать блоки задержания: sed -r 's@(<...>), и т.д. С другой стороны, ввиду того, что está s захватывая этикетку, что всегда será <etiqueta> и потом </etiqueta>, может быть интересно использовать ссылку \1 в первом блоке: <(etiqueta>)xxx</\1. Así ты избегаешь быть должным писать это снова. –  04.01.2017, 17:55