2015-08-10 2 views
-1

у меня есть файлы, как это:Perl регулярного выражение вложенная группировка результаты

mu (micro) | 10^(-6) | millionth 
m (milli) | 0.001 | thousandth 
k (kilo) | 10^3 | thousand 
M (mega) | 10^6 | million 

И я хотел бы, чтобы произвести файлы, такие как:

| $mu (micro)$ | $10^(-6)$ | $millionth$ | 
| $m (milli)$ | $0.001$ | $thousandth$ | 
| $k (kilo)$ | $10^3$ | $thousand$ | 
| $M (mega)$ | $10^6$ | $million$ | 

Я пытаюсь использовать регулярное выражение на языке Perl. И до сих пор лучший reexpression я мог придумать это:

perl -lpe '(([[:alnum:][:punct:]\s]+)\s+|\|\s*([[:alnum:][:punct:]\s]+)\s*\||\s*([[:alnum:][:punct:]\s]+))' 

Я знаю, что есть несколько избыточных \s+, но я попытался удалить их результат был хуже. Ток он только отделяет его в двух частях:

mu (micro) | 10^(-6) | 
millionth 

Итак, как я могу улучшить это, чтобы получить желаемый результат? Я знаю, что я могу использовать s/foo/bar/g, чтобы заменить его, но я не могу заставить это выражение правильно отделяться. Также как мне получить доступ к вложенным группам?

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

+0

'perl -lpe '(([[: alnum:] [: punct:] \ s] +) \ s + | \ | \ s * ([[: alnum:] [: punct:] \ s] +) \ s * \ || \ s * ([[: alnum:] [: punct:] \ s] +)) '' - чепуха. Это неверный код Perl. – melpomene

+0

Если вы знаете, что трубы уникальны как разделители: 'perl -E '$ s =" mu (micro) | 10^(- 6) | millionth "; @ a = split/\ | /, $ s; скажем, «| \ $». (присоединитесь к «\ $ | \ $», @ a). "\ $ |" '' –

ответ

0
perl -lpe '$_ = "| " . join(" | ", map "\$$_\$", split/\| /) . " |"' 

В словах: Разделить каждую строку на поля (на |), завернуть каждое поле в $...$, присоединиться поля с | и добавить | в начале и в конце.

0
perl -pi -e 's/^(\S+ +\S+) +\| +(\S+) +\| +(\S+)$/| \$$1\$ | \$$2\$ | \$$3\$ |/g' 
Смежные вопросы