Добавьте пробел перед заглавной буквой

Добавление заданных номеров в / etc / nanorc у меня работает в nano версии 2.7. 1 .

Его также можно активировать с помощью -l или - lnumber в командной строке.

Переключите номера строк в nano с помощью: M - # в моем случае Alt + Shift + 3 .

8
01.02.2017, 15:43
5 ответов

Используя sed, и предполагая, что пробел перед словом не нужен:

$ sed 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' file.in
Add Data
Test Something
Tell Me Who You Are

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

Для строк с более чем одним последовательным символом верхнего регистра, например WeAreATeam, получается We Are ATeam. Чтобы разобраться с этим, запустите подстановку второй раз:

$ sed -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' \
      -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' file.in
18
27.01.2020, 20:08
sed -r -e "s/([^A-Z])([A-Z])/\1 \2/g"

Добавить пробел между буквой, которая не является заглавной, и буквой буква в верхнем регистре

2
27.01.2020, 20:08

Perl, использующий регулярные выражения просмотра назад и вперед с нулевой шириной:

$ perl -pe 's/(?<=\w)(?=[A-Z])/ /g'  file.in 

Tell Me Who You Are                    ## TellMeWhoYouAre
I Am A Regular Expression User         ## IAmARegulaExpressionUser

Эта версия также разделяет следующие друг за другом буквы в верхнем регистре.

13
27.01.2020, 20:08

Решение Python:

#!/usr/bin/env python
from __future__ import print_function
import sys

with open(sys.argv[1]) as f:
    for line in f:
        for char in line:
            if char.isupper():
               print(" "+char,end="")
            else:
               print(char,end="")

Тестовый запуск:

$ ./add_space_to_upper.py input.txt                        
 Add Data
 Test Something
 Tell Me Who You Are
0
27.01.2020, 20:08

Пришел сюда, чтобы получить ответ на этот вопрос, и, прочитав другие предложения, пришел к решению, которое также обрабатывает случай ReadFromUSBDriveRead From USB Drive-Я адаптировал стиль выражения ka3ak и использование кусаланандой нескольких выражений для получения следующего:

 sed -r -e "s/([^A-Z])([A-Z])/\1 \2/g" -e "s/([A-Z]+)([A-Z])/\1 \2/g" file.in

напр.

$ sed -r -e "s/([^A-Z])([A-Z])/\1 \2/g" -e "s/([A-Z]+)([A-Z])/\1 \2/g" <<EOF
AddData
TestSomething
TellMeWhoYouAre
ReadFromUSBDrive
EOF
Add Data
Test Something
Tell Me Who You Are
Read From USB Drive

Обратите внимание, что в этом случае слова из одной -буквы, такие как артикль «A» или местоимение «I», будут забиты, когда они встречаются непосредственно перед аббревиатурой, поскольку они будут неотличимы от символов в предполагаемой аббревиатуре, например. ReadAUSBDriveотобразит Read AUSB Drive.

2
04.10.2021, 11:00

Теги

Похожие вопросы