에코가있는 줄을 삭제하는 방법?


60

마지막 세 문자를 삭제할 수 있음을 알고 있습니다.

echo -ne '\b\b\b'

그러나 전체 줄을 어떻게 삭제할 수 있습니까? 나는 사용하고 싶지 않다는 것을 의미한다.

echo -ne '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b'

긴 줄을 삭제합니다.


2
같은 줄에 지속적으로 글을 쓰고 싶은 사람들을 위해 : echo -ne "\033[2K" ; printf "\r"이제 줄은 이전에 쓰지 않은 것처럼 새로운 줄로 좋습니다.
Hello World

2
나는 당신이 그냥 사용할 수 있다고 확신합니다 echo -ne "\e[2K\r". 그럼에도 불구하고 ANSI 이스케이프 시퀀스 FTW.
Parthian Shot

답변:


57

\b또는 \r을 사용 하여 커서를 뒤로 이동 한 다음 인쇄 된 문자를 새 문자로 덮어 쓸 수 있습니다 . 인쇄 된 문자를 삭제 \b하거나 \r삭제 하지 않습니다 . 커서를 뒤로 이동시킵니다. \b커서를 한 문자 뒤로 \r이동하고 커서를 줄의 시작 부분으로 이동합니다.

예 : 둘 다

echo -e 'foooo\b\b\b\b\bbar'

echo -e 'foooo\rbar'

인쇄합니다 :

baroo

문자를 삭제하려면 다음 해결 방법을 사용해야합니다.

echo -e 'fooooo\r     \rbar'

산출:

bar  

발췌 man echo:

   If -e is in effect, the following sequences are recognized:

   \0NNN  the character whose ASCII code is NNN (octal)

   \\     backslash

   \a     alert (BEL)

   \b     backspace

   \c     produce no further output

   \f     form feed

   \n     new line

   \r     carriage return

   \t     horizontal tab

   \v     vertical tab

   NOTE: your shell may have its own version of echo, which usually super‐
   sedes the version described here.  Please refer to your  shell's  docu‐
   mentation for details about the options it supports.

4
예, 그러나 echo -e 'fooooooooo\rbar바로 오가 반향됩니다.
Mat

1
네, 맞아요. 참고 echo -e 'foooo\b\b\b\b\b\b\b\b\b\bbar'또한 에코 baroo.
lesmana

너무 달콤하고 완벽하게 작동합니다 printf.
Michael-O

4
매우 정확하지 않은 답변. Kevin의 것이 정말 좋습니다
Mike Aski

87

당신은 터미널 탈출을 찾고 있습니다. 특히 커서 위치에서 줄의 시작 부분을 지우려면 다음을 수행하십시오.

echo -e "\033[1K"

또는 커서 위치에 관계없이 줄의 모든 것 :

echo -e "\033[2K"

또한 터미널 이스케이프를 사용하여 모든 종류의 깔끔한 트릭을 수행 할 수 있습니다.


6
이것은 VT100 호환 터미널 또는 에뮬레이터를 가정합니다 (요즘 꽤 안전한 가정).
Keith Thompson

2
방금 에코 뭔가를 지우려면, 이전 에코 -n 플래그가 있어야합니다, 또는 당신이 새로운 라인으로 전송됩니다
djjeck

1
지우려는 줄에 다른 것을 쓰려면 위의 에코에 -n 플래그를 추가하십시오. 그렇지 않으면 새 줄로 이동합니다. 또한 위의 문자열에 \ r을 추가하지 않으면 새 내용이 해당 줄의 시작 부분으로 이동하지 않습니다.
djjeck 1

-1 | -eecho인수가 준수 +를 POSIX되지 나는 이스케이프 시퀀스를 좋아하지 않는다. 어느 쪽을 선호 printf하거나 tput.
LinuxSecurityFreak

@Vlastimil 왜 당신은 이것을 downvote하겠습니까? OP는 원하는 답변을 요청하지 않았습니다. 아마 그 precised해야 -e에 대한 매개 변수 echo... 준수하지만 여전히 POSIX되지 않는다
souki

35

줄을 지우려면 사람들이 언급 한 운송 정보와 terminfo의 조합을 사용하는 것이 좋습니다.

# terminfo clr_eol
ceol=$(tput el)
echo -ne "xyzzyxyzzy\r${ceol}foobar"

이것은을 쓴 xyzzyxyzzy다음 줄의 시작 부분으로 돌아가서 "줄의 끝을 지운다"순서를 터미널에 보낸 다음 씁니다 foobar. -n차종은 후 줄 바꿈을 추가하지 에코 foobar.


4
나는이 특정 솔루션의 미래 보장 부분을 좋아합니다 .tput을 사용하면 모든 종류의 터미널에서 작동 할 수 있습니다.
아모스 샤피 라

2
같은 더 나은 printf '%s\r%s%s' xyzzyxyzzy "$ceol" foobar휴대과의 내용을 피하기 위해 $ceol통과하는 \x확장.
Stéphane Chazelas

임의로 긴 줄로 작동하기 때문에 최상의 답변입니다. 감사!
Raphael

완벽하게 작동합니다. 그러나 출력 화면보다 작은 터미널 화면의 크기를 조정하면 지저분 해집니다.
K.Sopheak

11

명시 적으로을 echo요청하지만이 요청으로 핀을 고정시킵니다. printf괄호 확장과 함께 bash의 내장 명령 을 사용하는 접근 방식은 다음과 같습니다 .

printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character

1
완전한! 내가 필요한 것
Omar S.

2
printf '상태 : 시작됨'; 수면 2s; printf '\ r'; printf '상태 : 업데이트 됨'; 수면 2s; printf '\ r';
Omar S.

4

다음은 echo의 no newline -n캐리지 리턴 \r 옵션을 사용하는 예 입니다.

bash 덮어 쓰기 터미널 라인

#!/bin/bash

CHECK_MARK="\033[0;32m\xE2\x9C\x94\033[0m"

echo -e "\n\e[4mDoing Things\e[0m"
echo -n "doing thing 1..."
sleep 1
echo -e "\\r${CHECK_MARK} thing 1 done"

확인 표시는 RHEL6에서도 작동합니다. 내 스크립트를 완전히 미학적으로 편집하기에
좋습니다

1

대신 명령이 유용하다고 echo -en "\r"생각 될 수도 있습니다 printf "\r". 이 방법으로 문자열을 포맷 할 수 있습니다. 예 :

for sec in {1..100}; do printf "\r %04d" ${sec}; sleep 0.1; done

느린 파일 구문 분석으로 작업 할 때 목록을 작성하지 않고 현재 진행중인 파일 이름을 표시 할 때도 그렇게합니다.


-1 | 의도적으로 원 라이너를 만들고 싶었지만 실제로는 테스트에만 적합합니다. 새 줄로 올바르게 다시 씁니다.
LinuxSecurityFreak

0

질문으로 전체 줄을 삭제하십시오

나는의 조합으로 명령 아래 사용하고 있습니다 echosed라인을 삭제하는

명령이 실행 된 후 라인이 none으로 바뀌는 동안 비어 있습니다.

명령

echo  "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" | sed -r "s/.*//g"

-1

내가 사용하는 카운트 다운 타이머 예제는 다음과 같습니다.

i=10
while [ $i -gt 0 ]; 
do 
  printf "$i seconds remaining       " && printf '\r\033[1B'
  i=`expr $i - 1`
  sleep 1
  printf '\033[1A'
done

-1 | 의도적으로 원 라이너를 만들고 싶었지만 실제로는 테스트에만 적합합니다. 새 줄로 올바르게 다시 씁니다.
LinuxSecurityFreak

그런 다음 계속해서 새 답변을 추가하십시오. 또는 내 답변 편집을 제안하십시오.
mikiemorales
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.