"위에 동작은 잘 알고 있는데" - 이런 경우는 답변자가 불필요한 시간을 들이지 않도록 그 동작이 뭔지도 적어주시면 더 좋겠죠? :)
암튼 저건
:s - substitute 치환명령
그 다음 @ 는 그저 구분자입니다. 보통 치환할 때
:[범위]s/찾을패턴/대체할문자열/옵션
이렇게 슬래쉬로 구분을 하는데, 이 경우는 찾을 패턴에 슬래쉬가 있으니까
:s/\/\/.*//e
이렇게 일일이 백슬래쉬를 적어줘야 하는데 그게 귀찮으니 구분자를 다른 문자를 쓴 거네요.
// 이건 문자 그대로 슬래쉬 두 개
. 정규표현식에서 '임의의 문자 하나'
* 정규표현식에서 앞의 내용이 '0번 이상 반복되는 것'을 의미합니다.
그래서
.* 이것은 어떤 문자열(빈 문자열을 포함하여)에도 일치하는 패턴이 되고
//.* 이건 "백슬래쉬 두개와 그 뒤에 임의의 문자열"을 의미하는 패턴이니까 C++이나 자바 등의 코멘트에 매치하려는 건가보네요.
여기까지가 찾을 패턴이고 그 다음은 대체할 문자열을 적을 자리인데 거기가 비어있으니까 그냥 지우기만 하겠다는 얘기고,
마지막 e 는 저도 몰랐는데 :help substitute 해서 찾아보니까
원래 검색에 실패하면 에러메시지가 뜨는데 그러면 maps 를 처리하던 게 중단되어 버리니까
이런 에러메시지를 출력하지 말라는 옵션이라고 나와 있군요.
구분자란 게 대단한 게 아니고 말 그대로 여러 값들을 구분하기 위한 경계를 표시하는 거 얘깁니다.
abc 를 ABC 로 치환
:s/abc/ABC/
명령어 부분 :s
찾을 패턴 부분 abc
치환할 문자열 부분 ABC
이 세 가지를 구분할 수 있게 넣는 게 저 / 인데,
// 를 -- 로 치환
:s////--/
이건 안 됩니다. 찾을 패턴으로 쓴 / 과 구분자 / 를 구분할 수 없어서.
그래서 / 자체를 패턴이나 문자열 자리에 적으려면 백슬래시를 앞에 붙여서 이스케이프 시키죠.
:s/\/\//--/
근데 패턴이나 문자열 자리에 / 를 넣을 때마다 \를 같이 붙여주자니 너무너무너무 귀찮고, 보기도 싫고, 타이핑하다가 실수하기도 쉽고 그러니까, :substitute 명령을 쓸 때 구분자로 꼭 슬래시를 쓰는게 아니라 다른 걸 쓸 수도 있게 한 겁니다.
abc 를 ABC 로 치환
:s@abc@ABC@
// 를 -- 로 치환
:s@//@--@
이제는 / 가 구분자와 혼동될 염려가 없으니까 그냥 쓰면 됨.
@@ 를 oo 로 치환
:s@\@\@@oo@
대신 이번에는 @를 쓰려면 백슬래쉬를 붙여줘야겠죠. 물론 그보다는 그냥 다른 구분자를 쓰는게 낫고요.
(근데 @는 원래 다른 용도가 있어서 무조건 백슬래쉬를 붙여줘야 했던가? 기억이 안 나네요)
마지막의 e 옵션은... 저게 있을 때와 없는 경우를 각각 만들어보시고, 해당패턴(//로 시작하는 코멘트)이 존재하지 않는 텍스트 문서에서 실행해보시면 차이가 날 것 같습니다. 어쩌면 안 날 수도 있고.
현재 라인의 AAA 를 BBB로 치환 (first occurance only)
:s,AAA,BBB,
현재 라인의 AAA 를 삭제 (first occurance only)
:s,AAA,,
현재 라인의 모든 문자를 삭제
:s,.*,,
현재 라인에서 // 및 이후의 모든 문자를 삭제
:s,//.*,,
"위에 동작은 잘 알고 있는데" - 이런 경우는
"위에 동작은 잘 알고 있는데" - 이런 경우는 답변자가 불필요한 시간을 들이지 않도록 그 동작이 뭔지도 적어주시면 더 좋겠죠? :)
암튼 저건
:s - substitute 치환명령
그 다음 @ 는 그저 구분자입니다. 보통 치환할 때
이렇게 슬래쉬로 구분을 하는데, 이 경우는 찾을 패턴에 슬래쉬가 있으니까
이렇게 일일이 백슬래쉬를 적어줘야 하는데 그게 귀찮으니 구분자를 다른 문자를 쓴 거네요.
// 이건 문자 그대로 슬래쉬 두 개
. 정규표현식에서 '임의의 문자 하나'
* 정규표현식에서 앞의 내용이 '0번 이상 반복되는 것'을 의미합니다.
그래서
.* 이것은 어떤 문자열(빈 문자열을 포함하여)에도 일치하는 패턴이 되고
//.* 이건 "백슬래쉬 두개와 그 뒤에 임의의 문자열"을 의미하는 패턴이니까 C++이나 자바 등의 코멘트에 매치하려는 건가보네요.
여기까지가 찾을 패턴이고 그 다음은 대체할 문자열을 적을 자리인데 거기가 비어있으니까 그냥 지우기만 하겠다는 얘기고,
마지막 e 는 저도 몰랐는데 :help substitute 해서 찾아보니까
원래 검색에 실패하면 에러메시지가 뜨는데 그러면 maps 를 처리하던 게 중단되어 버리니까
이런 에러메시지를 출력하지 말라는 옵션이라고 나와 있군요.
좋은 하루 되세요!
몇일 고생하며 알아본건데
정말 감사합니다
즉
//------------
이런구문이 있다면 이거 이하를 전부 삭제하는 구문인가보네요~~~
안녕하세요 한가지 더 의문이 들어서 질문드립니다
어제도 댓글을 드렸지만
기본동작은 슬래시 있는 라인을 삭제 하는 구문입니다
답변중에 약간 의문이 있어서요~~죄송합니다 ~~
@는 구분자라고 하셨는데
그러면
\/\/ 과 @//는 같은 의미로 보이는데
보통 백슬래시하나당 한문자를 지정하는데
그러면 @는 그럼 범위가 한문자나 기호가 아닌 연속된건 즉 예를 들어
\/\/\\ 이런 구문이 있다면 @//\ 과 같은 의미인지요....
그리고 전체적으로 다시 의미를 곰곰히 생각을 했는데 아직도 이해가 확오지를 않아서요...
우선
@//.* : // 이하 라인을 찾는거라 보이고요
@@ : 여기서 @의 문법도 구분자인가요?
e : 말씀하신것을 읽어도 확이해가 가지 않네요 ..
죄송합니다... 저도 더 찾아보겠습니다 보시면 다시한번 이해 하기 쉽게 부탁드립니다...감사합니다
구분자란 게 대단한 게 아니고 말 그대로 여러 값들을
구분자란 게 대단한 게 아니고 말 그대로 여러 값들을 구분하기 위한 경계를 표시하는 거 얘깁니다.
명령어 부분 :s
찾을 패턴 부분 abc
치환할 문자열 부분 ABC
이 세 가지를 구분할 수 있게 넣는 게 저 / 인데,
이건 안 됩니다. 찾을 패턴으로 쓴 / 과 구분자 / 를 구분할 수 없어서.
그래서 / 자체를 패턴이나 문자열 자리에 적으려면 백슬래시를 앞에 붙여서 이스케이프 시키죠.
근데 패턴이나 문자열 자리에 / 를 넣을 때마다 \를 같이 붙여주자니 너무너무너무 귀찮고, 보기도 싫고, 타이핑하다가 실수하기도 쉽고 그러니까, :substitute 명령을 쓸 때 구분자로 꼭 슬래시를 쓰는게 아니라 다른 걸 쓸 수도 있게 한 겁니다.
마지막의 e 옵션은... 저게 있을 때와 없는 경우를 각각 만들어보시고, 해당패턴(//로 시작하는 코멘트)이 존재하지 않는 텍스트 문서에서 실행해보시면 차이가 날 것 같습니다. 어쩌면 안 날 수도 있고.
좋은 하루 되세요!
대단히 감사합니다
이제 명확하게 이해가 되었네요 진심으로 감사드립니다^^
@ 대신에 , 를 쓰면 좀 보기가
@ 대신에 , 를 쓰면 좀 보기가 좋으려나요..
댓글 달기