2011-04-19 6 views
14

Có thể lặp lại một backspace trong bash?Echoing một backspace

Something như

echo $'stack\b' 

nên không ra stac? Hoặc tôi đang thiếu một cái gì đó?

Cụ thể hơn, tôi muốn sử dụng trong:

ls | wc -l; echo $'\b items' 

Trả lời

25

\b làm cho di chuyển con trỏ sang trái, nhưng nó không xóa nhân vật. Xuất ra một không gian nếu bạn muốn xóa nó.

Đối với một số các bản phân phối bạn cũng có thể cần phải sử dụng -e tắc của echo:

-e  enable interpretation of backslash escapes 

Vì vậy, nó sẽ trông giống như

echo -e 'stack\b ' 

Ngoài ra, files=(*) ; echo "${#files[@]} items".

+0

Hmm, và tất nhiên nó không thể backspace trên một dòng mới, phải không? Đó là lý do tại sao giải pháp ban đầu của tôi không hoạt động (tôi đoán). Cảm ơn các giải pháp tốt đẹp cho các tập tin đếm. Tôi muốn cung cấp cho +2 nếu tôi có thể :-) – sidyll

+0

Tại sao phương pháp xóa này không hoạt động cho các dòng mới? – Geremia

+0

'\ b' trả về một ký tự đơn, tới cạnh trái của thiết bị đầu cuối. Một dòng mới theo nghĩa đen là một dòng * mới *, vì vậy dòng thứ hai có cạnh trái của chính nó. –

1

Nó không phải là chính xác những gì bạn đang yêu cầu, mà còn, trong dòng câu trả lời Ignacio, bạn có thể sử dụng cho trường hợp này:

echo "$(ls | wc -l) items" 

AFAIK bạn không thể in một nhân vật mà xóa một trước , thậm chí không in char có số hexadecimanl correspoonds để backspace. Tuy nhiên, bạn có thể lùi lại và in một khoảng trống để xóa. Với cput bạn có thể thực hiện nhiều thứ và in bất cứ nơi nào bạn muốn trên màn hình.

2

Vì vậy, để trả lời câu hỏi thực tế về backspaces này sẽ mô phỏng một backspace:

echo -e "\b \b" 

Nó sẽ di chuyển nhân vật trở lại một, sau đó echo một không gian ghi đè lên bất kỳ nhân vật đã ở đó, sau đó di chuyển trở lại một lần nữa - có hiệu lực xóa ký tự trước đó. Nó sẽ không quay trở lại một dòng mặc dù vậy đầu ra trước đó sẽ không tạo ra một dòng mới:

echo -n "blahh"; echo -e "\b \b"