Регулярное выражение - Linux - между, но не включая - PullRequest
0 голосов
/ 20 февраля 2019

Я нахожусь в Linux (CentOS) и пытаюсь захватить что-то, похожее на

 This, formatting | is, 123gh234ee2, {absolutely}, [ positively | obnoxious | in ], {every}, [ {single} | {way} ],, Thanks | For your | Help!

Я хочу заменить все каналы |, но только те, которые находятся внутри [].Итак ...

 This, formatting | is, 123gh234ee2, {absolutely}, [ positively ; obnoxious ; in ], {every}, [ {single} ; {way} ],, Thanks | For your | Help!

Я пробовал несколько выражений, но, как мне кажется, должно работать, не работает.Может кто-нибудь объяснить, почему?

sed -i 's/(?<=\[)(\|)(?=\])/;/g' 'myFile.txt'

Моя идея заключалась в том, чтобы заглянуть в будущее с [101 *

(?<=\[)

. Познакомиться с

(?=\])

И захватитьтрубы с

(\|)

Однако в моем файле ничего не меняется, и я действительно не могу понять, что случилось.

Спасибо!

Чтобы уточнить,Я также попробовал метод perl

cat '/myFile.txt' | perl -ne 's/(?<=\[)(\|)(?=\])/xxxxx/g; print;'

И все равно не получил измененный результат.

1 Ответ

0 голосов
/ 20 февраля 2019

Ваши регулярные выражения lookbhind и lookahead пытаются сопоставить отдельные символы.Они, вероятно, будут работать, если ваш входной текст содержит ровно [|].

Теоретически, вы хотите, чтобы ваш взгляд назад был чем-то вроде (?<=\[.*), но реальность такова, что большинство движков не обрабатывают просмотр произвольной длины.

Вы можете использовать sed {command ; block } для реализации цикла, добавляя различные сегменты строки во внутренний буфер по одному, а затем выводите всю строку после прекращения сопоставления.

Aлучшей идеей, IMO, было бы переключиться на язык, который позволял бы вам использовать скобки для разделения текста.

Вы можете использовать awk, perl или python, например, чтобы захватить текст между [] и затем обработайте это отдельно.Это будут не регулярные выражения, а небольшие сценарии.

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

sed -e 's/\[/\n@[/g' -e 's/]/]\n/g'

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

sed -e '/^@\[/s/\|/;/g' # On lines starting with @[ replace | with ;

Теперь вам нужно склеить строки обратно, которые вы можете найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...