Tôi đã đọc một số câu hỏi thao tác chuỗi bash đường ống khác nhưng chúng dường như là các ứng dụng chuyên biệt.
Về cơ bản, có cách nào để làm đơn giản hơn dưới đây?
thay vì
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
cái gì đó như
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Chỉnh sửa Tôi quan tâm đến việc duy trì các thao tác bash nếu có thể để duy trì tốc độ (trái ngược với sed / awk có xu hướng làm chậm rất nhiều kịch bản của tôi)
Chỉnh sửa2: @jimmij
Tôi thích ví dụ thứ hai và dẫn tôi đến việc thực hiện một chức năng.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
hướng dẫn sử dụng, thì ngược lại là đúng vì thời gian sinh ra các quy trình là không đáng kể so với thời gian thao tác chuỗi. sed
và awk
được dành riêng. Nếu chuỗi quá dài, hãy nói toàn bộ hướng dẫn sử dụng bash, sau đó bash chỉ có thể từ chối tiến hành hoàn toàn, vì một số hạn chế bên trong.
sed
, awk
, tr
hoặc tương đương. Hãy xem câu trả lời của gena2x mà tôi đã chỉnh sửa trước đây để thêm chính xác thông tin này: unix.stackexchange.com/questions/162221/. Bạn có thể muốn so sánh nó với câu trả lời terdon cho cùng một câu hỏi mà anh ấy dành thời gian cho các chuỗi ngắn trong đó quá trình sinh sản mất nhiều thời gian nhất. Bạn có thể tự kiểm tra và đăng kết quả.
read x; echo $x
này tốt hơn cho hiệu suất? Cú pháp trông không ngắn hơn hoặc sạch hơn. x=${x// /_}; x=${x^^}
là một cách ngắn gọn hơn nhiều để làm điều tương tự như {read x; echo ${x...
. Theo như hiệu suất, @jimmij đã chỉ ra rằng tr
/ sed
sẽ nhanh hơn bash
, số ngã ba là bằng nhau. Sử dụng một đường ống luôn dẫn đến một quá trình bổ sung để đối số lưu một ngã ba không còn được áp dụng. Vì vậy, nếu đang sử dụng đường ống, chỉ cần sử dụng sed
/ tr
vv Nếu bạn có thể làm điều đó trong bash, hãy làm như vậy và bỏ qua điều read x; echo $x
vô nghĩa này .