Câu trả lời:
Đây là một cách thẳng vào sed
:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
hoặc một cách ngắn hơn với GNU sed
, làm việc với bất kỳ ký tự nào có chuyển đổi chữ thường <-> chữ hoa tồn tại trong ngôn ngữ của bạn:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
nếu bạn có thể sử dụng các công cụ khác, như:
perl
(giới hạn ở các chữ cái ASCII):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl
(nói chung hơn):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sed
và trường hợp thay thế trong đầu vào. Sử dụng sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'
thay thế (vẫn là GNU cụ thể). Chữ cái đầu tiên chỉ chuyển đổi 26 chữ cái la tinh ASCII, trong khi chữ cái thứ hai chuyển đổi bất kỳ chữ cái nào được nhận diện bởi ngôn ngữ của bạn. Điều tr
duy nhất có ý nghĩa trong các địa phương ASCII. Các perl
người duy nhất làm việc cho ASCII chữ cái la tinh.
POSIXly, điều đó không thể được thực hiện sed
ngoại trừ bằng cách cung cấp bộ chữ cái hoàn chỉnh mà bạn muốn phiên âm như @cuonglm đã hiển thị .
Nó có thể được thực hiện với tr
mặc dù, và đó là những gì tr
dành cho (phiên âm):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Tuy nhiên, trên Linux, nó có những hạn chế. Trong số 3 tr
triển khai thường thấy trên các hệ thống dựa trên Linux:
tr
, nó chỉ hoạt động cho các bộ ký tự một byte. Ví dụ, trên Stéphane Chazelas
các địa phương UTF-8, cung cấp sTéPHANE cHAZELAS
thay vì sTÉPHANE cHAZELAS
. Đó là một hạn chế đã biết của GNU tr
.tr
công cụ gia truyền, nó không hoạt động (bạn nhận được stéphane chazelas
).tr
sẽ làm.Trên FreeBSD hoạt động tốt mặc dù. Bạn cũng mong nó hoạt động tốt trong các hệ thống Unix được chứng nhận.
Các bash
vỏ có một nhà điều hành dành riêng cho điều đó:
in=AbCdE
out=${in~~}
Với zsh -o extendedglob
:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ
(e2 b4 a0) là Ⴠ
(e1 83 80); cả i
(69) và ı
(c4 b1) đều có I
(49) là chữ hoa (ngoại trừ ở các địa phương Thổ Nhĩ Kỳ nơi i
trở thành İ
). Lý do nó không hoạt động với GNU tr
là GNU tr
hoạt động với byte chứ không phải ký tự.
[:lower:]
hoặc [:upper:]
(vì vậy lần đầu tiên bị bỏ qua). Ngay cả trong tiếng Pháp, œ -> Œ
là c5 93 -> c5 92
trong UTF-8 và bd -> bc
iso8859-15.
Mặc dù điều này có những hạn chế tương tự đã được đề cập như tr
giải pháp được cung cấp bởi Stéphane Chazelas, nhưng đó là một cách khác để làm điều đó:
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
Tôi đổ stderr
vào /dev/null
đó vì dd
cũng cung cấp số liệu thống kê về tất cả các hoạt động của nó trên bộ 2
mô tả tệp. Điều này có thể hữu ích tùy thuộc vào những gì bạn đang làm, nhưng không phải cho cuộc biểu tình này. dd
Ví dụ, tất cả những thứ khác bạn có thể làm vẫn áp dụng:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBc
không được chuyển đổi thành AbC
).
Nếu mục tiêu chính của bạn là chuyển đổi một tệp từ lớp dưới sang lớp trên, tại sao bạn không sử dụng tr
và STDOUT
chuyển đổi tệp của mình:
$cat FILENAME | tr a-z A-Z > FILENAME2
FILENAME
Tập tin gốc của bạn ở đâu FILENAME2
Tập tin đầu ra được chuyển đổi của bạn ở đâu
é
ví dụ như (ít nhất là trong tệp của tôi).
sử dụng awk
:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txt
sẽ bắt đầu bằng cách cắt bớt tệp
ruby
có một phương thức chuỗi cho điều đó, cách sử dụng tương tự từ dòng lệnh như perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
Xem thêm Mã hóa ruby-doc
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
Giữ điều đơn giản đơn giản. Bộ lọc được thiết kế để dịch các ký tự là tr
.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
tr
sẽ phù hợp hơnsed
.