Tôi cần có thể làm là thay thế một khoảng trắng ( ) bằng dấu chấm (
.
) trong chuỗi trong bash.
Tôi nghĩ rằng điều này sẽ khá đơn giản, nhưng tôi là người mới nên tôi không thể tìm ra cách sửa đổi một ví dụ tương tự cho việc sử dụng này.
Tôi cần có thể làm là thay thế một khoảng trắng ( ) bằng dấu chấm (
.
) trong chuỗi trong bash.
Tôi nghĩ rằng điều này sẽ khá đơn giản, nhưng tôi là người mới nên tôi không thể tìm ra cách sửa đổi một ví dụ tương tự cho việc sử dụng này.
Câu trả lời:
Sử dụng thay thế chuỗi vỏ nội tuyến. Thí dụ:
foo=" "
# replace first blank only
bar=${foo/ /.}
# replace all blanks
bar=${foo// /.}
Xem http://tldp.org/LDP/abs/html/opes-manipulation.html để biết thêm chi tiết.
tr
! ... Tùy thuộc vào bộ nhớ khả dụng và tài nguyên hw ... Nhưng bạn đã đúng!: Tùy thuộc vào loại công việc cần làm, các công cụ chuyên dụng sẽ hiệu quả hơn!
$'\n'
Bạn có thể sử dụng tr
, như thế này:
tr " " .
Thí dụ:
# echo "hello world" | tr " " .
hello.world
Từ man tr
:
MÔ TẢ
Dịch, ép và / hoặc xóa các ký tự từ đầu vào tiêu chuẩn, ghi vào đầu ra tiêu chuẩn.
Trong bash, bạn có thể thực hiện thay thế mẫu trong một chuỗi với ${VARIABLE//PATTERN/REPLACEMENT}
cấu trúc. Sử dụng chỉ /
và không //
thay thế chỉ xảy ra lần đầu tiên. Mẫu này là một mẫu ký tự đại diện, giống như các tập tin.
string='foo bar qux'
one="${string/ /.}" # sets one to 'foo.bar qux'
all="${string// /.}" # sets all to 'foo.bar.qux'
Sử dụng thay thế tham số:
string=${string// /.}
Hãy thử điều này cho các đường dẫn:
echo \"hello world\"|sed 's/ /+/g'|sed 's/+/\/g'|sed 's/\"//g'
Nó thay thế khoảng trắng bên trong chuỗi trích dẫn kép bằng một +
tiếng hát, sau đó thay thế +
dấu hiệu bằng dấu gạch chéo ngược, sau đó xóa / thay thế dấu ngoặc kép.
Tôi đã phải sử dụng điều này để thay thế các không gian trong một trong những con đường của tôi ở Cygwin.
echo \"$(cygpath -u $JAVA_HOME)\"|sed 's/ /+/g'|sed 's/+/\\/g'|sed 's/\"//g'
sed
. Các trích dẫn là không liên quan.
tr
các chuỗi dài. Trên hệ thống của tôitr
vượt trội hơn bash bắt đầu từ các chuỗi có nhiều hơn1000
ký tự. Có vẻ như độ phức tạp thời gian của bash còn tệ hơn tuyến tính. Một thử nghiệm nhỏ :x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Với độ dài chuỗi là 1M (= 2 ^ 20)tr
đã lấy0.04s
và bash 5.0.11 đã lấy17s
. Với 2Mtr
đã lấy0.07s
(dự kiến) nhưng bash mất69s
(gấp 4 lần chiều dài chuỗi gấp đôi).