Как заменить определенный шаблон в нескольких файлах?

Похоже, кто-то инициировал «запрос новой строки», например

 printf '\n' | nc localhost 80

который выводит это в access.log:

127.0.0.1 - - [27/Apr/2019:01:39:38 +0200] "\n" 400 0 "-" "-"

Вероятно, чтобы протестировать ваш сервер...

0
16.04.2021, 15:40
2 ответа

Если ваши файлы так просты, как показано, вы можете:

find force-app -type f -name "*-meta.xml" \
    -exec sed -i '' -e 's|<apiVersion>[0-9]*[0-9.]*[0-9]*</apiVersion>|<apiVersion>52.0</apiVersion>|' {} \;

Обратите внимание, что в Linux это приведет к ошибке, и вы можете использовать это вместо этого:

find force-app -type f -name "*-meta.xml" \
  -exec sed -i 's|<apiVersion>[0-9]*[0-9.]*[0-9]*</apiVersion>|<apiVersion>52.0</apiVersion>|' {} \;
2
28.04.2021, 22:52

Как обычно, вы действительно не хотите изменять файлы XML с помощью инструмента редактирования текста, ориентированного на строку -. XML не является форматом документа с разделителями новой строки -.

Чтобы обновить значение узла /Component/apiVersionв одном XML-документе, рассмотрите возможность использования xmlstarletследующим образом:

xmlstarlet ed \
    -N x='http://soap.sforce.com/2006/04/metadata' \
    -u '/x:Component/x:apiVersion' -v '52.0' file-meta.xml

Выражение XPath /x:Component/x:apiVersionбудет соответствовать узлу, который вы хотите обновить, в пространстве имен с именемx(это определено с помощью -Nдля соответствия пространству имен в вашем документе ). Обычно, т. е. когда XML-документ не имеет пространства имен, вам не нужно возиться с -Nили с префиксом x:к именам узлов, как мы сделали здесь. Новое значение задается с помощью -v.

Вы можете редактировать несколько файлов в -месте вот так:

xmlstarlet ed --inplace \
    -N x='http://soap.sforce.com/2006/04/metadata' \
    -u '/x:Component/x:apiVersion' -v '52.0' *-meta.xml

Или, позвонив изfind:

find force-app -type f -name '*-meta.xml' \
    -exec xmlstarlet ed --inplace \
        -N x='http://soap.sforce.com/2006/04/metadata' \
        -u '/x:Component/x:apiVersion' -v '52.0' {} +

Если вы хотите внести изменение только тогда, когда значение еще не равно 52.0, вместо этого используйте выражение XPath /x:Component/x:apiVersion[text() != "52.0"].


Использованиеxq(синтаксического анализатора XML, части yq, оболочки YAML вокруг jq, синтаксического анализатора JSON изhttps://kislyuk.github.io/yq/):

$ xq -x '.Component.apiVersion |= "52.0"' file.xml
<Component xmlns="http://soap.sforce.com/2006/04/metadata">
  <apiVersion>52.0</apiVersion>
</Component>
4
28.04.2021, 22:52

Теги

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