2015-01-06 3 views
0

나는이 (text.txt)와 같은 파일에 일부 라인을 대체하는 스크립트를 실행하려면 -s 옵션을 사용하여 정력을 사용하기 위해 노력하고있어 문자 잎 이 (스크립트) :정력 스크립트는 표준 입력

:silent %s/test1\zs\_.\+\zetest2/\=substitute(submatch(0), '\n\(\w\)', '\n#\1', 'g')/g 
:wq 

그것은 test1과 test2 사이의 줄을 주석 처리합니다. 그게 내가 원하는거야. 내가 원하지 않는 것은 출력 전후에 출력됩니다. 나는 그것을 실행하고 얻을 :

[email protected]: ~/vimtest$ vim -s script text.txt 
^[[?1;[email protected]: ~/vimtest$ 1;2c 

그래서 ^[[?1;2c 이미 나쁜 소식입니다하지만 난 이미 입력 한 것처럼 1;2c 입력입니다. 내가 Enter를 누르면 내게 bash 오류가 발생합니다. 따라서 스크립트를 사용할 때마다 이러한 기호를 제거해야합니다. 어떤 아이디어?

답변

2

그것은 vim (또는 정력 시작 스크립트)처럼 보인다입니다 어떤 유형의 터미널을 사용하고 있는지 파악하려고합니다. 입력 버퍼에 마지막 몇 글자가 남은 ^[[?1;2c은 DA (Device Attributes) 쿼리에 대한 터미널 에뮬레이터의 응답의 거의 일부입니다.

printf '\033[c' 

또는, 전체 수익을보고, 조금 일시 :

printf '\033[c'; sleep 0.1; echo 

응답 \033[?1;2c 나는 고급 비디오 옵션을 가진 VT100 해요 "를 의미 당신은 떠들썩한 파티를 입력하여이 자신을 볼 수 있습니다 . "어떤 xterm 및 다른 많은 콘솔 프로그램이 응답합니다. (리눅스 콘솔 자체는 \033[?6c으로 응답합니다. "나는 VT102입니다.")

1;2c 그렇고 콘솔 입력 버퍼에 남아있는 이유는, 그것이 판독 할 때, 초기 이스케이프 코드 \033[?는 무시이다. readline 라이브러리를 반향없이 무시 정상 콘솔 반면 입력은 에코를 무시한 다음 무시하게됩니다. 위의 두 쉘 명령이 서로 다른 이유가 여기에 있습니다.

vim 설치시이 문제를 재현 할 수 없으므로 어디서부터 시작해야할지 모릅니다. 모든 시작 파일을 사용 중지하면 도움이되는지 확인하십시오.

vim -u NONE -s script text.txt 

도움이된다면 문제의 원인이 될 때까지 설치된 확장 프로그램을 하나씩 비활성화하십시오.

+0

고마워요! '-u NONE' 옵션이 풀렸고 범인은'~/.vimrc'의'syntax on'줄이었습니다 – lonelyelk

+1

@lonelyelk : 문법 파일 어딘가에 (아마도 초기화 과정에서) 버그가있는 vim 스크립트가 있습니다. 파기를 시작하려면'$ VIMRUNTIME/syntax/syntax.vim'과'$ VIMRUNTIME/syntax/synload.vim'로 시작하는'$ VIMRUNTIME/syntax' 디렉토리의 파일을보십시오. 행운을 빕니다. – rici

1
:%s/test1\zs\_.\+\ze\ntest2/\=substitute(submatch(0), '\n', '\n#', 'g')/g 
:wq 

여기에서 테스트 한 결과 입력 파일이 필수적으로 변경되었습니다.

일부 변경 명령에 따라 끝났 :

  • 우리는 단지 우리는 \n
  • 후 단어를 캡처하지 않아도 \n을 처리 할 수있는 대신에 \ze
  • () 함수 이후 \n를 추가
1

나는 질문에 bash이라는 태그를 붙 였으므로 쉘 솔루션도 받아 들여야한다고 생각했습니다.

awk '/test1/{p=1;print;next}/test2/{p=0;print;next}{$0=(p?"#":"")$0}7' file 

이 awk oneliner가이를 수행해야합니다. vim은 매우 강력한 편집기입니다. 저는 vim을 좋아합니다. 그러나 자동 변환을 원할 경우 스크립트 또는 적절한 텍스트 처리 도구를 선호합니다. 리눅스 박스에서 항상 하나를 찾을 수 있습니다. 테스트하고 디버그하는 것이 더 쉽습니다. 귀하의 의견과

테스트 :

kent$ cat f 
test1 
ab 
ac 
ae 
test2 
sd 

kent$ awk '/test1/{p=1;print;next}/test2/{p=0;print;next}{$0=(p?"#":"")$0}7' f 
test1 
#ab 
#ac 
#ae 
test2 
sd 

당신이 당신의 파일에 다시 텍스트를 저장하려면, 당신은 할 수 있습니다

awk '...' file > tmp.file && mv tmp.file file 
+0

이 제안에 감사드립니다. sudo는 덜 편리합니다. 이 모든 것은 주석을 달고/etc/hosts 파일의 청크를 되돌려 야 할 필요성에서 왔습니다. 매일 같이. – lonelyelk