sed one-liner để chuyển đổi tất cả chữ hoa sang chữ thường?


131

Tôi có một tệp văn bản trong đó một số từ được in trong TẤT CẢ CAPS. Tôi muốn có thể chuyển đổi mọi thứ trong tệp văn bản thành chữ thường, sử dụng sed. Điều đó có nghĩa là câu đầu tiên sau đó sẽ đọc, 'tôi có một tệp văn bản trong đó một số từ được in trong tất cả các chữ hoa.'


6
Bạn có biết trlệnh không? Đôi khi nó phù hợp hơn sed.
Bryan Oakley

@Bryan Oakley Tôi đã không cho đến bây giờ. Cảm ơn đã chỉ ra điều đó. Nhưng làm thế nào để tôi sử dụng nó để làm những gì tôi đang yêu cầu?
nam châm

tìm trong liên kết được cung cấp trong câu trả lời của Raghuram.
Bryan Oakley

1
nếu bạn phải sử dụng sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Bạn phải ghi chi tiết tất cả các ký tự, chữ hoa cho chữ thường. Tôi biết thật khó để viết tất cả những ký tự đó, nhưng nó cũng sẽ hoạt động với tất cả các ký tự ĐẶC BIỆT quốc tế đó. :)
Arno Teigseth

Câu trả lời:


248

Với tr:

# Converts upper to lower case 
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt

# Converts lower to upper case
$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt

Hoạt động bằng GNU sed(BSD sedkhông hỗ trợ \L \U):

# Converts upper to lower case
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt

# Converts lower to upper case
$ sed -e 's/\(.*\)/\U\1/' input.txt > output.txt

6
Tôi đã phải chọn câu trả lời của riêng mình vì tôi không phải là người thích câu trả lời chỉ bao gồm các liên kết.
nam châm

6
OSX không hỗ trợ các phần mở rộng GNU :(
ekkis

2
sed -e 's/.*/\L&/' input.txt > output.txtcho GNU sed cũng hoạt động tốt
Asfand Qazi

1
@ekkis OSX đang sử dụng BSD (như đã đề cập, BSD sed không hỗ trợ nó). Hãy thử đọc dòng trên cùng man sedđể biết bạn đang sử dụng phiên bản nào.
Ryder

Vì một số lý do khi tôi sử dụng mẫu chữ hoa của bạn, nó sẽ thêm Uvào trước mỗi dòng
Xtremefaith

51

Nếu bạn có các tiện ích mở rộng GNU, bạn có thể sử dụng sed \ \ (toàn bộ kết quả khớp hoặc cho đến khi \ L [thấp hơn] hoặc \ E [kết thúc chuyển đổi tắt], như vậy:

sed 's/.*/\L&/' <input >output

Lưu ý: '&' có nghĩa là mẫu khớp hoàn toàn.

Là một lưu ý phụ, các phần mở rộng GNU bao gồm \ U (trên), \ u (ký tự tiếp theo trên của đối sánh), \ l (ký tự tiếp theo thấp hơn của đối sánh). Ví dụ: nếu bạn muốn quay vòng câu:

$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case
Now Is The Time For All Good Men...

Lưu ý: Vì giả định là chúng tôi có các phần mở rộng GNU, nên chúng tôi cũng có thể sử dụng tùy chọn dash-r (biểu thức chính quy mở rộng), cho phép \ w (ký tự từ) và giúp bạn thoát khỏi dấu ngoặc đơn và một hoặc nhiều hơn định lượng (+). (Ngoài ra: \W [non-word], \s [whitespace], \S [non-whitespace]cũng được hỗ trợ với dash-r, nhưng \d [digit]\D [non-digit]không.)


1
Mẹo rất hữu ích. Tôi đã thấy rằng các dấu ngoặc tròn không cần thiết trong ví dụ trường hợp lạc đà. 's / \ w + / \ u & / g' cũng hoạt động.
PJ_Finnegan

1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- sử dụng công cụ /isửa đổi làm cho trường hợp khớp không nhạy và do đó là tùy chọn. Công -itắc báo cho sed thay đổi tập tin tại chỗ. Không cần phải chuyển hướng đầu ra sang tệp khác nếu bạn không phải.
Jim

1
Tôi thực sự cần điều này \E [end - toggle casing off]. Cảm ơn bạn !
Mehdi Yedes

37

Bạn cũng có thể làm điều này rất dễ dàng với awk, nếu bạn sẵn sàng xem xét một công cụ khác:

echo "UPPER" | awk '{print tolower($0)}'

1
Câu trả lời tốt nhất của nó, becouse làm việc với cyrillic. tr: - không làm việc với nó.
Amaroc

2
Xem ra cho các nhân vật có dấu. tolowersẽ không thể xử lý Àví dụ
Sam Houston

Bạn có thể đổi tên một loạt các tệp bằng lệnh đó: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus

15

Dưới đây là nhiều giải pháp:

Để upercaser với perl, tr, sed và awk

perl -ne 'print uc'
perl -npe '$_=uc'
perl -npe 'tr/[a-z]/[A-Z]/'
perl -npe 'tr/a-z/A-Z/'
tr '[a-z]' '[A-Z]'
sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
sed 's/\([a-z]\)/\U\1/g'
sed 's/.*/\U&/'
awk '{print toupper($0)}'

Để viết thường với perl, tr, sed và awk

perl -ne 'print lc'
perl -npe '$_=lc'
perl -npe 'tr/[A-Z]/[a-z]/'
perl -npe 'tr/A-Z/a-z/'
tr '[A-Z]' '[a-z]'
sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
sed 's/\([A-Z]\)/\L\1/g'
sed 's/.*/\L&/'
awk '{print tolower($0)}'

Bash phức tạp để viết thường:

while read v;do v=${v//A/a};v=${v//B/b};v=${v//C/c};v=${v//D/d};v=${v//E/e};v=${v//F/f};v=${v//G/g};v=${v//H/h};v=${v//I/i};v=${v//J/j};v=${v//K/k};v=${v//L/l};v=${v//M/m};v=${v//N/n};v=${v//O/o};v=${v//P/p};v=${v//Q/q};v=${v//R/r};v=${v//S/s};v=${v//T/t};v=${v//U/u};v=${v//V/v};v=${v//W/w};v=${v//X/x};v=${v//Y/y};v=${v//Z/z};echo "$v";done

Bash phức tạp để viết hoa:

while read v;do v=${v//a/A};v=${v//b/B};v=${v//c/C};v=${v//d/D};v=${v//e/E};v=${v//f/F};v=${v//g/G};v=${v//h/H};v=${v//i/I};v=${v//j/J};v=${v//k/K};v=${v//l/L};v=${v//m/M};v=${v//n/N};v=${v//o/O};v=${v//p/P};v=${v//q/Q};v=${v//r/R};v=${v//s/S};v=${v//t/T};v=${v//u/U};v=${v//v/V};v=${v//w/W};v=${v//x/X};v=${v//y/Y};v=${v//z/Z};echo "$v";done

Bash đơn giản để viết thường:

while read v;do echo "${v,,}"; done

Bash đơn giản để viết hoa:

while read v;do echo "${v^^}"; done

Lưu ý rằng $ {v,} và $ {v ^} chỉ thay đổi chữ cái đầu tiên.

Bạn nên sử dụng nó theo cách đó:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt

7
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Đầu ra:

xin chào tên tôi là sujit

5

Tôi thích một số câu trả lời ở đây, nhưng có một lệnh sed nên thực hiện thủ thuật trên bất kỳ nền tảng nào:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Dù sao, nó dễ hiểu. Và biết về lệnh y đôi khi có thể có ích.


2
Điều này không hoạt động đối với các ký tự quốc tế tùy ý nhưng không hoạt động đối với các ký tự ASCII trong OS / X
emrys57

Nó chắc chắn đã làm công việc cho tôi. Tôi phải thừa nhận đó là lần đầu tiên tôi sử dụng lệnh y. Cảm ơn!
monsune

4

Nếu bạn đang sử dụng posix sed

Lựa chọn cho bất kỳ trường hợp nào cho một mẫu (chuyển đổi mẫu được tìm kiếm bằng sed này hơn là sử dụng mẫu đã chuyển đổi trong lệnh bạn muốn bằng regex:

echo "${MyOrgPattern} | sed "s/[aA]/[aA]/g;s/[bB]/[bB]/g;s/[cC]/[cC]/g;s/[dD]/[dD]/g;s/[eE]/[eE]/g;s/[fF]/[fF]/g;s/[gG]/[gG]/g;s/[hH]/[hH]/g;s/[iI]/[iI]/g;s/[jJ]/[jJ]/g;s/[kK]/[kK]/g;s/[lL]/[lL]/g;s/[mM]/[mM]/g;s/[nN]/[nN]/g;s/[oO]/[oO]/g;s/[pP]/[pP]/g;s/[qQ]/[qQ]/g;s/[rR]/[rR]/g;s/[sS]/[sS]/g;s/[tT]/[tT]/g;s/[uU]/[uU]/g;s/[vV]/[vV]/g;s/[wW]/[wW]/g;s/[xX]/[xX]/g;s/[yY]/[yY]/g;s/[zZ]/[zZ]/g" | read -c MyNewPattern
 YourInputStreamCommand | egrep "${MyNewPattern}"

chuyển đổi trong trường hợp thấp hơn

sed "s/[aA]/a/g;s/[bB]/b/g;s/[cC]/c/g;s/[dD]/d/g;s/[eE]/e/g;s/[fF]/f/g;s/[gG]/g/g;s/[hH]/h/g;s/[iI]/i/g;s/j/[jJ]/g;s/[kK]/k/g;s/[lL]/l/g;s/[mM]/m/g;s/[nN]/n/g;s/[oO]/o/g;s/[pP]/p/g;s/[qQ]/q/g;s/[rR]/r/g;s/[sS]/s/g;s/[tT]/t/g;s/[uU]/u/g;s/[vV]/v/g;s/[wW]/w/g;s/[xX]/x/g;s/[yY]/y/g;s/[zZ]/z/g"

tương tự cho chữ hoa thay thế chữ cái thấp hơn giữa // bằng chữ hoa tương đương trong sed

Chúc vui vẻ


(Tôi thấy cái này hoạt động tốt nhất trên MacOS) - Nice, bạn của tôi - nhưng một topo nhỏ - bạn có trường hợp Jj ngược. Nên là sed "s / [aA] / a / g; s / [bB] / b / g; s / [cC] / c / g; s / [dD] / d / g; s / [eE] / e / g; s / [fF] / f / g; s / [gG] / g / g; s / [hH] / h / g; s / [iI] / i / g; s / [jJ] / j / g; s / [kK] / k / g; s / [lL] / l / g; s / [mM] / m / g; s / [nN] / n / g; s / [oO] / o / g; s / [pP] / p / g; s / [qQ] / q / g; s / [rR] / r / g; s / [sS] / s / g; s / [tT] / t / g; s / [uU] / u / g; s / [vV] / v / g; s / [wW] / w / g; s / [xX] / x / g; s / [yY] / y / g; s / [zZ] / z / g "
Neil McGill

Tôi không chắc tại sao bạn cần phải làm một cái gì đó rất nhiều lao động. Tôi giả sử Mac OS không có tiện ích mở rộng GNU, nhưng nếu bạn đã chết khi sử dụng sed, thay vì thay thế ('s'), bạn có thể sử dụng phiên âm ('y') như vậy: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijk / '
Luv2code

mục tiêu là chọn bất kỳ mẫu văn bản nào trông giống chữ thường / chữ thường từ một sed sed GNU mà không thay đổi nội dung của nguồn dữ liệu ( y//thay đổi nội dung của nguồn hoặc có thể bỏ lỡ tìm kiếm mẫu.
NeronLeVelu 14/07/2015

3

ngắn, ngọt ngào và bạn thậm chí không cần chuyển hướng :-)

perl -p -i -e 'tr/A-Z/a-z/' file

Hah, tôi đã cố gắng sử dụng cái này với một cái nhìn phía sau và bằng cách nào đó nó đã thay thế hầu hết tất cả các chữ cái trong các tập tin của tôi bằng chữ in hoa ngẫu nhiên khác. Đã cho tôi một tiếng cười tốt. Tôi đã có thể rút ra những gì tôi muốn từ câu trả lời này về perl: askubfox.com/a/527073/250556
ThorSummoner 14/07/2015
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.