vi 패턴검색 삭제 연산에서요.
글쓴이: khalisto / 작성시간: 화, 2015/03/03 - 2:11오후
구글에서 vi 관련 명령어를 검색하다 command mode에서 적용가능한 아래 명령을 발견했는데
:/pattern1/,/pattern2/d : pattern1 이 들어있는 줄부터, pattern2 가 들어있는 줄까지 지우기
테스트를 해보니 pattern1 에서 pattern2 까지의 내용을 모두 삭제하는것은 확인하였는데 위에서 아래로만 처리가 되는것 같더라구요.
예를들면
aa 파일 내용이 아래와 같을 때
apple
banana
orange
mango
/apple/,/orange/d 를 실행하면 mango 만 남고 모두 삭제가 정상적으로 되나
/orange/,/apple/d 로 실행하면 아래와 같은 메시지가 출력되며 정상적인 처리가 안되는데
Backwards range given, OK to swap (y/n)?
혹시 이를 처리 할 수 있는 별도의 옵션이 있는지요??
Forums:
vi(m)을 커맨드인으로 호출하여 패턴 치환을 하는
vi(m)을 커맨드인으로 호출하여 패턴 치환을 하는 것은 그렇게 좋은 방법은 아닙니다.
vim을 호출하는 오버해드가 너무 클 듯.
sed 또는 perl을 쓰는 것이 정석입니다만,
그래도 해야겠다면, 원하시는 내용은
입니다.
또 한가지는 입력이
라면
:/orange/,/apple/d
라고 했을때 어디를 지우는 것이 사용자의 의도인지 명백하지가 않네요.
backward range를 지원하지 않는 것이 오히려 더 나은 방법같습니다.
:/orange/,/apple/d
:/orange/,/apple/d 실행시 역순으로 orange 에서 apple까지
삭제 되는것이 결과값입니다.
테스트 해보니 동작은 하는데 조금 문제가 있네요.
우선 도움주셔서 감사합니다.
말주변이 부족해 설명이 정확히 않았는데 우선 파일내용이
apple
banana
orange
mango
일때는 orange 부터 apple 까지 모두 처리가 되었는데 파일 내용이
apple
melon
apple
banana
orange
mango
일 때는 orange 부터 melon 상단의 apple 까지 모두 삭제가 되버리는데
원하는 결과는 orange부터 역순으로 첫번째 apple 까지 입니다만 이 경우 별도의 처리 방법이 있는지요?
이 경우는 :silent
이 경우는
:silent /orange/;?apple?d
로 하면 됩니다.
다만 이렇게 하면 아래 입력이 원하는대로 안되겠죠.
banana
orange
mango
apple
mango
apple
원하시는 모든 조건을 만족하는 하나의 search+replace 식은 없을 것 같습니다.
말로 "역순으로 첫번째" "..부터 ..까지
말로 "역순으로 첫번째" "..부터 ..까지 모두"이렇게 표현하지 마시고 샘플 입력과 원하는 출력을 보여주시는 게 나을 것 같습니다.
이렇게 되길 원하시는데 Swap 어쩌고 하는 질문이 뜨지 않게 해달라는 거 맞는지요?
정도로 하니 잘 되는군요. 다만 커서가 ?apple 검색을 했을 때 3행이 먼저 잡힐 수 있는 위치(1행, 4행~6행)에 있는 상태에서만 저렇게 되고 커서가 2행이나 3행에 있을 때는 1행의 apple 이 먼저 검색되어 버려서 결과적으로 1~5행이 지워지네요.
좋은 하루 되세요!
감사합니다. 잘 해결하였습니다. ^^
감사합니다. 위방법들을 응용하여 잘 해결하였습니다. ^^
댓글 달기