Chuyển đổi nội dung tập tin sang chữ thường


85

Tôi có temptập tin với một số nội dung viết thường và viết thường.

Đầu vào

Nội dung temptập tin của tôi :

hi
Jigar
GANDHI
jiga

Tôi muốn chuyển đổi tất cả từ trên xuống dưới .

Chỉ huy

Tôi đã thử lệnh sau:

sed -e "s/[A-Z]/[a-z]/g" temp

nhưng có đầu ra sai.

Đầu ra

Tôi muốn nó như:

hi
jigar
gandhi
jiga

Những gì cần phải là trong phần thay thế của tranh luận cho sed?


Câu trả lời:


122

Nếu đầu vào của bạn chỉ chứa các ký tự ASCII, bạn có thể sử dụng trnhư:

tr A-Z a-z < input 

hoặc (ít dễ nhớ và gõ IMO; nhưng không giới hạn ở các chữ cái la tinh ASCII, mặc dù trong một số triển khai bao gồm GNU tr, vẫn bị giới hạn ở các ký tự byte đơn, do đó, trong các ngôn ngữ UTF-8, vẫn giới hạn ở các chữ cái ASCII):

tr '[:upper:]' '[:lower:]' < input

nếu bạn phải sử dụng sed:

sed 's/.*/\L&/g' < input

(ở đây giả sử thực hiện GNU).

Với POSIX sed, bạn cần chỉ định tất cả các phiên âm và sau đó bạn có thể chọn chữ cái bạn muốn chuyển đổi:

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

Với awk:

awk '{print tolower($0)}' < input

3
Xin lưu ý rằng đó \Llà một phần mở rộng GNU.
Anthon

\Llàm việc tốt cho tôi cho đến nay. Hãy làm sáng tỏ điểm mà bạn đang cố gắng để mở rộng GNU
JigarGandhi

2
@JigarGandhi. sedlà một lệnh Unix. Các hệ thống khác nhau có các biến thể khác nhau với hành vi và chức năng khác nhau. Rất may, ngày nay, có một tiêu chuẩn phù hợp nhất để bạn có thể tin tưởng vào một bộ tính năng tối thiểu chung cho tất cả. \Lkhông nằm trong số đó và được GNU giới thiệu sed(khớp với cùng một toán tử trong tiêu chuẩn ex/ vi) và thường không có sẵn trong các triển khai khác.
Stéphane Chazelas

9
Lưu ý rằng một số trtriển khai như GNU trkhông hoạt động chính xác trong các địa điểm nhiều byte (hầu hết trong số chúng hiện nay, hãy thử, echo STÉPHANE | tr '[:upper:]' '[:lower:]'chẳng hạn). Trên các hệ thống GNU, bạn có thể thích sedbiến thể hoặc awk's tolower().
Stéphane Chazelas

5
Điều chỉnh nhẹ : sed 's/.*/\L&/g' < input. Các \1tham chiếu đến chuỗi con phù hợp sẽ không làm việc trừ khi bạn chỉ định chuỗi với dấu ngoặc như wurtle làm trong mình. Tuy nhiên, nó sẽ sạch hơn một chút để sử dụng &để đại diện cho toàn bộ trận đấu, như được hiển thị
Edward Brown

30

Sử dụng vim, nó rất đơn giản:

$ vim filename
gg0guGZZ

Mở tệp, ggđi đến dòng 0đầu tiên, cột đầu tiên. Với guG, giảm trường hợp của tất cả các ký tự cho đến dưới cùng của tập tin. ZZtiết kiệm và thoát ra.

Nó sẽ xử lý bất cứ thứ gì bạn ném vào nó; nó sẽ bỏ qua các con số, nó sẽ xử lý phi ASCII.

Nếu bạn muốn làm ngược lại, hãy biến các chữ cái viết thường thành chữ hoa, đổi chỗ ulấy U: gg0gUGZZvà bạn đã thiết lập.


14
Lol "siêu đơn giản"
blambert 17/2/2017

điều này rõ ràng không có quy mô tốt cho nhiều tệp
Corey Goldberg

câu trả lời yêu thích nhất của tôi cho đến nay !!!!
Mona Jalal

1
@CoreyGoldberg vim file1 file2 fileetcvà sau đó một cái gì đó có thể:bufdo gg0guG:w<CR> sẽ hoạt động cho bất kỳ số lượng tệp. Chưa thử nghiệm điều đó!
TankorSmash

@TankorSmash vẫn không mở rộng được số lượng lớn tệp
Corey Goldberg

17

Tôi thích ddđiều này, bản thân mình.

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

...được...

hi
jigar
ghandi
jiga

Điều LC_ALL=Cnày là để bảo vệ bất kỳ đa bào trong đầu vào - mặc dù mọi thủ đô đa nhân sẽ không được chuyển đổi. Điều này cũng đúng với (GNU) tr - cả hai ứng dụng đều có xu hướng nhập dữ liệu vào bất kỳ ngôn ngữ không C nào. iconvcó thể được kết hợp với một trong hai cho một giải pháp toàn diện.

Các 2>/dev/nullvứt bỏ redirect ddbáo cáo 's mặc định trạng thái - và stderr của nó. Nếu không có nó ddsẽ hoàn thành một công việc như thông tin w / in ở trên như có bao nhiêu byte được xử lý, v.v.


Giải pháp này nhanh hơn nhiều so với trkhi xử lý các tệp lớn, cảm ơn!
WhiteWinterWolf

13

Bạn cũng có thể sử dụng Perl 5:

perl -pe '$_=lc' temp

Tùy chọn -pyêu cầu perl chạy biểu thức đã chỉ định một lần cho mỗi dòng đầu vào, in kết quả, tức là giá trị cuối cùng của $_. -echỉ ra rằng chương trình sẽ là đối số tiếp theo, trái ngược với tệp chứa tập lệnh. lcchuyển đổi thành chữ thường. Nếu không có đối số, nó sẽ hoạt động $_. Và $_=lưu lại một lần nữa để nó sẽ được in.

Một biến thể của điều đó sẽ là

perl -ne 'print lc' temp

Sử dụng -ngiống như -pngoại trừ $_việc cuối cùng sẽ không được in. Vì vậy, thay vì lưu vào biến đó, tôi bao gồm một câu lệnh in rõ ràng.

Một lợi ích của Perl trái ngược với sed là bạn không cần bất kỳ tiện ích mở rộng GNU nào. Có những dự án phải tương thích với môi trường không phải GNU nhưng cũng có phụ thuộc Perl asa. So với tr, có thể là Perl lccó thể dễ dàng nhận biết địa phương hơn. Xem perllocaletrang người đàn ông để biết chi tiết.


9

Bạn cần chụp mẫu phù hợp và sau đó sử dụng nó trong phần thay thế bằng công cụ sửa đổi:

sed 's/\([A-Z]\)/\L\1/g' temp

Các \(...\)"bắt" các văn bản kèm theo phù hợp, việc bắt giữ đầu tiên đi vào \1, bên cạnh \2vv Việc đánh số được theo mở ngoặc trong trường hợp chụp lồng nhau.

Việc \Lchuyển đổi mẫu đã chụp thành chữ thường, cũng có \Uchữ hoa.


3
bạn không cần phải làm điều này - toàn bộ mô hình luôn bị cuốn vào&
mikeerv

Đúng, nhưng sau đó tôi đã bỏ lỡ cơ hội để giải thích các trận đấu bắt :-)
wurtel

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.