Thêm khoảng trắng trước chữ hoa


8

Tôi có một chuỗi:

AddData
TestSomething
TellMeWhoYouAre

và như thế. Tôi muốn thêm không gian trước chữ in hoa. Tôi làm nó như thế nào?


7
Bạn muốn làm gì khi có chữ in hoa liên tiếp? ví dụIClimbALadder
glenn jackman

1
Trên thực tế tôi có một chuỗi như ReadFileFromCDDrivevà giải pháp của @Kusalananda hoạt động rất tốt.
HeroFromEarth

Câu trả lời:


16

Sử dụng sedvà giả sử bạn không muốn có khoảng trắng phía trước từ:

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

Sự thay thế sẽ tìm kiếm một chữ cái viết hoa ngay sau một ký tự không phải khoảng trắng khác và chèn một khoảng trắng ở giữa hai chữ cái.

Đối với các chuỗi có nhiều hơn một ký tự chữ hoa liên tiếp, như thế WeAreATeam, điều này tạo ra We Are ATeam. Để sắp xếp thứ này, hãy chạy thay thế lần thứ hai:

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

1
Câu trả lời này sẽ không thêm khoảng trắng trước một chữ cái viết hoa nếu nó đứng trước một chữ cái viết hoa. Tại sao lại viết theo cách đó, khi OP không đặt bất kỳ hạn chế nào như vậy lên nó?
LarsH

@LarsH Đã sửa nó.
Kusalananda

Không, bạn đã không. Bạn không thể có các trận đấu chồng chéo lên một biểu thức chính quy, ngay cả với một gcờ. Hãy thử echo ThisIsATest | sed 's/\(.\)\([[:upper:]]\)/\1 \2/g'(lệnh của bạn) để xem tại sao nó không hoạt động.
tự đại diện

@Wildcard Wonky, nhưng hoạt động. Bạn có một đề nghị tốt hơn bằng cách sử dụng BREs?
Kusalananda

Nó thực sự không nói không có khoảng trống khi bắt đầu, vì vậy s/[A-Z]/ \0/ghoàn toàn thỏa đáng ... `s / [AZ] / \ 0 / g; s / ^ // 'nếu bạn thực sự quan tâm.
Michael Homer

12

Perl, sử dụng biểu thức chính quy lookbehind và lookahead zero-width:

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

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

Phiên bản này cũng đang phân tách các chữ cái viết hoa liên tiếp.


1
Điều này biến ReadFileFromUSBDrivethành Read File From U S B Drivetrong khi OP muốn Read File From USB Drive.
Kusalananda

1
@Kusalananda, cảm ơn bạn đã chỉ ra. (Tôi sợ rằng tôi không thấy điều đó được viết trong câu hỏi). Trong các tình huống thực tế (hiểu lập trình, mở rộng các từ id và các biến thể của CamelCase), người ta thường sử dụng một tiêu chí cơ bản (được chia thành Uppercase đơn hoặc ngược lại) và có một từ điển ngoại lệ.
JJoao

1
Xin lỗi, đó là điều mà OP đã viết trong các bình luận cho câu trả lời của tôi. Tôi đồng ý, thật khó để làm điều này mà không có một danh sách từ nào đó.
Kusalananda

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

Thêm khoảng trắng giữa một chữ cái không phải là chữ cái viết hoa và một chữ cái là một chữ cái viết hoa


Brevity là chấp nhận được, nhưng giải thích đầy đủ hơn là tốt hơn. . Ngoài ra, điểm của [^^]("không phải là dấu mũ ( ^)") là gì?
Kusalananda

@Kusalananda Bạn nói đúng. Không gian sẽ không được chèn vào giữa ^ và Thêm vào "^ AddData". Tôi đã chỉnh sửa câu trả lời của mình.
ka3ak

0

Giải pháp 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="")

Chạy thử nghiệm:

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

Bạn muốn print(line[0], end="")theo sau for char in line[1:]:để tránh in không gian không mong muốn đó ở đầu mỗi dòng đầu ra.
Paul Evans
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.