Cách chèn dấu gạch ngang vào một chuỗi bằng cách sử dụng sed (ví dụ: 201107
đến 2011-07
)?Chèn ký tự tại một vị trí cụ thể bằng cách sử dụng sed
Trả lời
Sau đây sẽ chỉ thực hiện thay thế trên các chuỗi gồm bốn chữ số, theo sau là các chuỗi gồm hai chữ số.
$ echo '201107' | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)/\1-\2/'
2011-07
Sed regex là một chút vụng về, vì sự thiếu \d
, và sự cần thiết để thoát khỏi dấu ngoặc đơn và dấu ngoặc (nhưng không phải giá treo đồ). Giải pháp của tôi nên là 's/(\d{4})(\d{2})/\1-\2/'
nếu không cho những đặc thù này.
echo "201107" | sed 's/201107/2011-07/'
Nên hoạt động. Nhưng chỉ đùa thôi, đây là giải pháp tổng quát hơn:
echo "201107" | sed 's/^\(.\{4\}\)/\1-/'
Điều này sẽ chèn -
sau bốn ký tự đầu tiên.
HTH
Tôi biết điều này là diggin lên một con khủng long khổng lồ, nhưng nếu bạn muốn loại bỏ 6 số không tailing
echo '20110715000000' | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{6\}\)/\1-\2-\3/'
Đối với phiên bản sed không chắc chắn (ít nhất là GNU tôi sed 4.2.2) , bạn chỉ có thể làm:
echo "201107" | sed 's/./&-/4'
/4
-> thay thế cho sự xuất hiện lần thứ 4 (các mô hình tìm kiếm .
)
&
-> trở lại tham chiếu đến toàn bộ trận đấu
Tôi học được điều này từ bài khác: https://unix.stackexchange.com/questions/259718/sed-insert-character-at-specific-positions