vi 패턴검색 삭제 연산에서요.

khalisto의 이미지

구글에서 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)?

혹시 이를 처리 할 수 있는 별도의 옵션이 있는지요??

qiiiiiiiip의 이미지

vi(m)을 커맨드인으로 호출하여 패턴 치환을 하는 것은 그렇게 좋은 방법은 아닙니다.
vim을 호출하는 오버해드가 너무 클 듯.
sed 또는 perl을 쓰는 것이 정석입니다만,

그래도 해야겠다면, 원하시는 내용은

:silent /orange/,/apple/d 

입니다.

또 한가지는 입력이

apple
banana
orange
mango
apple

라면
:/orange/,/apple/d
라고 했을때 어디를 지우는 것이 사용자의 의도인지 명백하지가 않네요.
backward range를 지원하지 않는 것이 오히려 더 나은 방법같습니다.
khalisto의 이미지

:/orange/,/apple/d 실행시 역순으로 orange 에서 apple까지

삭제 되는것이 결과값입니다.

khalisto의 이미지

우선 도움주셔서 감사합니다.

말주변이 부족해 설명이 정확히 않았는데 우선 파일내용이

apple
banana
orange
mango

일때는 orange 부터 apple 까지 모두 처리가 되었는데 파일 내용이

apple
melon
apple
banana
orange
mango

일 때는 orange 부터 melon 상단의 apple 까지 모두 삭제가 되버리는데

원하는 결과는 orange부터 역순으로 첫번째 apple 까지 입니다만 이 경우 별도의 처리 방법이 있는지요?

qiiiiiiiip의 이미지

이 경우는
:silent /orange/;?apple?d
로 하면 됩니다.

다만 이렇게 하면 아래 입력이 원하는대로 안되겠죠.
banana
orange
mango
apple
mango
apple

원하시는 모든 조건을 만족하는 하나의 search+replace 식은 없을 것 같습니다.

raymundo의 이미지

말로 "역순으로 첫번째" "..부터 ..까지 모두"이렇게 표현하지 마시고 샘플 입력과 원하는 출력을 보여주시는 게 나을 것 같습니다.

1 apple
2 melon
3 apple
4 banana
5 orange
6 mango

1 apple
2 melon
6 mango

이렇게 되길 원하시는데 Swap 어쩌고 하는 질문이 뜨지 않게 해달라는 거 맞는지요?

:silent ?orange?,?apple?d

정도로 하니 잘 되는군요. 다만 커서가 ?apple 검색을 했을 때 3행이 먼저 잡힐 수 있는 위치(1행, 4행~6행)에 있는 상태에서만 저렇게 되고 커서가 2행이나 3행에 있을 때는 1행의 apple 이 먼저 검색되어 버려서 결과적으로 1~5행이 지워지네요.

좋은 하루 되세요!

khalisto의 이미지

감사합니다. 위방법들을 응용하여 잘 해결하였습니다. ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.