help - sed - вставить пробел между строками формы XxxXxx, не заменяя шаблон - PullRequest
4 голосов
/ 22 декабря 2010

Если строка имеет шаблон XxxXyzAbc ...
Ожидаемый выход от sed должен быть Xxx Xyz Abc ...

Например: если строка QcfEfQfs , то ожидаемый результат равен Qcf Ef Efs.

Если я попытаюсь заменить шаблон [a-z] [A-Z] пробелом, то sed заменит символ или шаблон пробелом, как Qc f fs.

Есть ли способ вставить пробел между ними без замены шаблона?

Пожалуйста, помогите. Благодарю.

Ответы [ 3 ]

6 голосов
/ 22 декабря 2010

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

$ sed 's/\([a-z]\)\([A-Z]\)/\1 \2/g' <<< 'XxxXyzAbc'
Xxx Xyz Abc
0 голосов
/ 05 апреля 2014

Это может сработать для вас (GNU sed):

sed 's/\B[[:upper:]]/ &/g' file

Поиск границы, не состоящей из слов, за которой следует символ верхнего регистра, и вставка пробела по всей строке.

0 голосов
/ 22 декабря 2010

Более точное сопоставление с шаблоном - одно с меньшим количеством ложных совпадений для строк, которые не в формате XxxYyyZzz, - это:

sed 's/\([A-Z][a-z][a-z]*\)\([A-Z][a-z][a-z]*\)\([A-Z][a-z][a-z]*\)/\1 \2 \3/'

Рассмотрим входные данные:

XxxYyyZzz
xxxYyyZzz
X xY yZ z

Еще один ответ, который я вижу, вставит пробелы во все строки - когда он должен только изменить первую строку.

Обновлено с учетом примера QcfEfEfs - из вопроса не ясно, сколько строчных букв в строке допускается. Это может быть 1 или 2; или это может быть 1 или более - использование * допускает 1 или более; в противном случае используйте \{1,2\} для 1 или 2.

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