Tambahkan spasi sebelum huruf besar


8

Saya punya string:

AddData
TestSomething
TellMeWhoYouAre

dan seterusnya. Saya ingin menambahkan spasi sebelum huruf besar. Bagaimana saya bisa melakukannya?


7
Apa yang ingin Anda lakukan ketika ada huruf besar berturut-turut? contohIClimbALadder
— glenn jackman

1
Sebenarnya saya punya string seperti ReadFileFromCDDrivedan solusi @Kusalananda berfungsi dengan baik.
— HeroFromEarth

Jawaban:


16

Menggunakan sed, dan dengan asumsi Anda tidak ingin spasi di depan kata:

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

Substitusi akan mencari huruf besar segera setelah karakter non-spasi putih lainnya, dan menyisipkan spasi di antara keduanya.

Untuk string dengan lebih dari satu karakter huruf besar berturut-turut, seperti WeAreATeam, ini menghasilkan We Are ATeam. Untuk mengurutkan ini, jalankan subtitusi kedua kalinya:

$ sed -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' \
      -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' file.in

1
Jawaban ini tidak akan menambah spasi sebelum huruf besar jika didahului dengan huruf besar. Mengapa menulis seperti itu, ketika OP tidak membatasi seperti itu?
— LarsH

@ LarsH Memperbaikinya.
— Kusalananda

Tidak, kamu tidak. Anda tidak dapat memiliki pertandingan yang tumpang tindih dengan regex, bahkan dengan gbendera. Coba echo ThisIsATest | sed 's/\(.\)\([[:upper:]]\)/\1 \2/g'(perintah Anda) untuk melihat mengapa itu tidak berhasil.
— Wildcard

@ Kartu Memori Wonky, tapi berhasil. Apakah Anda memiliki saran yang lebih baik menggunakan BRE?
— Kusalananda

Itu sebenarnya tidak mengatakan tidak ada ruang di awal, jadi s/[A-Z]/ \0/gsepenuhnya memuaskan ... `s / [AZ] / \ 0 / g; s / ^ // 'jika Anda benar-benar peduli.
— Michael Homer

12

Perl, menggunakan lookbehind dan lookahead ekspresi reguler nol-lebar:

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

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

Versi ini juga memisahkan huruf besar berturut-turut.


1
Ini berubah ReadFileFromUSBDrivemenjadi Read File From U S B Driveyang diinginkan OP Read File From USB Drive.
— Kusalananda

1
@ Kusalananda, terima kasih telah menunjukkannya. (Saya khawatir saya tidak melihat itu tertulis dalam pertanyaan). Dalam situasi nyata (pemahaman pemrograman, perluasan kata-kata id, dan varian CamelCase) adalah umum untuk menggunakan kriteria dasar (baik dibagi menjadi huruf besar tunggal atau sebaliknya) dan memiliki kamus pengecualian.
— JJoao

1
Maaf, itu adalah sesuatu yang OP tulis dalam komentar untuk jawaban saya. Saya setuju, sulit melakukan ini tanpa daftar kata.
— Kusalananda


0

Solusi 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="")

Uji coba:

$ ./add_space_to_upper.py input.txt                        
 Add Data
 Test Something
 Tell Me Who You Are

Anda ingin print(line[0], end="")diikuti oleh for char in line[1:]:untuk menghindari mencetak ruang yang tidak diinginkan di awal setiap baris output.
— Paul Evans
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.