Node Js утилита замены в файле - PullRequest
1 голос
/ 06 марта 2020

Я использовал утилиту replace-in-file node js для замены строковых значений в файлах. Используя эту утилиту, как ее можно вызвать из скрипта bash. Однако на этот раз есть необходимость заменить следующую строку, если я найду данную строку в предыдущей строке. Например,

<values>
    <field>Namespace__c</field>
    <value xsi:nil="true"/>
</values>

Утилита должна искать строку Пространство имен и, если она найдена, должна заменить следующую строку, т.е.

<value xsi:nil="true"/>

, с указанным значением. Я пытался сделать это с помощью регулярного выражения

module.exports = { 
    from: '/<field>Namespace__c</field>\n<value xsi:nil="true"/>/g', 
    to: '<field>Namespace__c</field>\n<value xsi:type="xsd:string">namespace</value>', 
    files:[ 'path to file/*.md' ], 
    isRegex: true, 

, но пока безуспешно. Заранее спасибо за помощь!

1 Ответ

1 голос
/ 06 марта 2020

Вы можете использовать GNU sed:

sed -i '/Namespace/{N;s,\(\n[[:space:]]*\).*,\1<value xsi:type="xsd:string">namespace</value>,}' your_file

См. онлайн-демонстрацию :

s='<values>
    <field>Namespace__c</field>
    <value xsi:nil="true"/>
</values>'

sed '/Namespace/{N;s,\(\n[[:space:]]*\).*,\1<value xsi:type="xsd:string">namespace</value>,}' <<< "$s"

Результат:

<values>
    <field>Namespace__c</field>
    <value xsi:type="xsd:string">namespace</value>
</values>

Подробности

  • /Namespace/ - сопоставить строку, содержащую Namespace
  • { - если есть совпадение
    • N; - добавить новую строку в пространство шаблона и добавить следующую строку к ней
    • s,\(\n[[:space:]]*\).*,\1<value xsi:type="xsd:string">namespace</value>,: находит и захватывает в Группе 1 новую строку и 0+ пробелов после нее, а затем сопоставляет всю строку с конец с .*, а затем заменяет совпадение текстом в группе 1 (\1) и выбранной вами строкой
  • } - конец блока.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...