Результат

Результат

Первоначальная проблема

У меня есть папкаjsxфайлы среагировать-intlсинтаксис в них выглядит следующим образом:

  ...
  <div>
    <ul>
      <li><FormattedMessage id='some.language.key_1' defaultMessage='Some message 1' /></li>
      <li><FormattedMessage id='some.language.key_2' defaultMessage='Some message 2' /></li>
      <li><FormattedMessage id='some.language.key_3' defaultMessage='Some message 3' /></li>
    </ul>
  </div>
  <div>
    <p>Some other contents</p>
  </div>
  ...

Я хотел бы создать файл со всеми <FormattedMessage>тегами в папке. Вывод должен выглядеть так:

...
<FormattedMessage id='some.language.key_1' defaultMessage='Some message 1' />
<FormattedMessage id='some.language.key_2' defaultMessage='Some message 2' />
<FormattedMessage id='some.language.key_3' defaultMessage='Some message 3' />
...

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

grep -REho '<FormattedMessage .*\/>' my/target/folder/.

Моя текущая проблема

Все усложняется, когда некоторые реальные результаты выглядят следующим образом:

<FormattedMessage id='some.lang.key_1' defaultMessage="Hello {myvar}" values={{ myvar: <FormattedMessage id='some.lang.key_2' defaultMessage='World' /> }} />} />

И я бы хотел создать 2 отдельные линии для такого рода узоров:

<FormattedMessage id='some.lang.key_1' defaultMessage="Hello {myvar}" values={{ myvar: <FormattedMessage id='some.lang.key_2' defaultMessage='World' /> }} />} />
<FormattedMessage id='some.lang.key_2' defaultMessage='World' />

Можно ли это как-то сделать с помощью магии команд Unix?


Обновлять: Более разумный пример файла:

<ul>
  <li><FormattedMessage id='lang.key_1' defaultMessage='Message 1' /></li>
  <li><FormattedMessage id='lang.key_2' defaultMessage='Message 2' /></li>
  <li><FormattedMessage id='lang.key_3' defaultMessage='Message 3' /></li>
  <li><FormattedMessage id='lang.key_4' defaultMessage='Message 4' /></li>
  <li><FormattedMessage id='lang.key_5' defaultMessage="Message 5 with {inner}" values={{ inner: <Link><FormattedMessage id='lang.key_6' defaultMessage='Message 6' /></Link> }} /></li>
  <li><FormattedMessage id='lang.key_7' defaultMessage='Message 7' /></li>
</ul>

Желаемый результат:

<FormattedMessage id='lang.key_1' defaultMessage='Message 1' />
<FormattedMessage id='lang.key_2' defaultMessage='Message 2' />
<FormattedMessage id='lang.key_3' defaultMessage='Message 3' />
<FormattedMessage id='lang.key_4' defaultMessage='Message 4' />
<FormattedMessage id='lang.key_5' defaultMessage="Message 5 with {inner}" values={{ inner: <Link><FormattedMessage id='lang.key_6' defaultMessage='Message 6' /></Link> }} />} /></li>
<FormattedMessage id='lang.key_6' defaultMessage='Message 6' />
<FormattedMessage id='lang.key_7' defaultMessage='Message 7' />

решение1

Ваша проблема разрешима, recursive regexesпоскольку шаблон содержится в одном и том же шаблоне несколько раз.

perl -lane '
   $. == 1 and $re = qr{
      (                        # capturing group start
         <FormattedMessage\s   # match tag opening
           (?:
              (?>[^<>])+       # consume as many non-angle brackets as is possible
                |
              (?1)             # otherwise, recurse
                |
              (?>.*?>)         # skip a noninteresting tag
           )*
        />                     # match tag closing
     )                         # capturing group end
  }x;

  next unless /<FormattedMessage\s/;

  while ( my @tags = /$re/g ) {
    print for @tags;
    $_ = join $,, map { s/^<(.*)>$/$1/r } @tags;
  }

' file1

Результат

<FormattedMessage id='lang.key_1' defaultMessage='Message 1' />
<FormattedMessage id='lang.key_2' defaultMessage='Message 2' />
<FormattedMessage id='lang.key_3' defaultMessage='Message 3' />
<FormattedMessage id='lang.key_4' defaultMessage='Message 4' />
<FormattedMessage id='lang.key_5' defaultMessage="Message 5 with {inner}" values={{ inner: <Link><FormattedMessage id='lang.key_6' defaultMessage='Message 6' /></Link> }} />
<FormattedMessage id='lang.key_6' defaultMessage='Message 6' />
<FormattedMessage id='lang.key_7' defaultMessage='Message 7' />

решение2

Передайте вывод из вашего первого grepв sed:

sed -n 'p;s,..*\(<FormattedMessage[^>]*>\).*,\1,p'

Выход:

$ grep -REho '<FormattedMessage .*\/>' file | sed -n 'p;s,..*\(<FormattedMessage[^>]*>\).*,\1,p'

<FormattedMessage id='lang.key_1' defaultMessage='Message 1' />
<FormattedMessage id='lang.key_2' defaultMessage='Message 2' />
<FormattedMessage id='lang.key_3' defaultMessage='Message 3' />
<FormattedMessage id='lang.key_4' defaultMessage='Message 4' />
<FormattedMessage id='lang.key_5' defaultMessage="Message 5 with {inner}" values={{ inner: <Link><FormattedMessage id='lang.key_6' defaultMessage='Message 6' /></Link> }} />
<FormattedMessage id='lang.key_6' defaultMessage='Message 6' />
<FormattedMessage id='lang.key_7' defaultMessage='Message 7' />

Связанный контент