원래 문제
나는 다음과 같은 폴더를 가지고 있습니다.jsx파일반응 국제그 안에 있는 구문은 다음과 같습니다.
...
<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' />