vi заменяется двумя вопросительными знаками вместо одного вопросительного знака - PullRequest
0 голосов
/ 02 апреля 2012
<?php echo $form->create(); ?> 
   <?php echo $form->hidden('id'); ?> 
   <?php echo $form->input('name')); ?> 
   <?php echo $form->submit('Save'); ?> 
<?php echo $form->end(); ?>   

Я хочу заменить ";?" с "?".

Я использовал команду vi ":% s /; \? / \? / G", чтобы сделать это. Я получил следующий вывод

<?php echo $form->create() ??> 
   <?php echo $form->hidden('id') ??> 
   <?php echo $form->input('name')) ??> 
   <?php echo $form->submit('Save') ??> 
<?php echo $form->end() ??> 

На самом деле мне нужен следующий вывод.

<?php echo $form->create() ?>
   <?php echo $form->hidden('id') ?>
   <?php echo $form->input('name')) ?>
   <?php echo $form->submit('Save') ?>
<?php echo $form->end() ?>

Можете ли вы дать объяснение этому странному поведению?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

\? - это регулярное выражение vi для нормального ? в регулярных выражениях других программ.

Вы можете посмотреть :h regex, чтобы проверить это (или, точнее, :h E61).

Таким образом, при использовании ; \? вы сопоставляете ; (без пробела) и ;<space> (один пробел).Из этих совпадений самый жадный (см. E61 - как можно больше) будет заменен на ?, что приведет к двум вопросительным знакам (одному новому и старому) при наличии пробела.

Правильное выражение будет: s/; ?/ ?/g

РЕДАКТИРОВАТЬ: исправлено объяснение, чтобы быть более точным.

1 голос
/ 02 апреля 2012

:%s/; \?/ \?/g

; \? соответствует ;<space> ноль или один раз, и он заменяет их на ?.
Таким образом, вы получаете оригинал ? с другим ?.

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