-
Notifications
You must be signed in to change notification settings - Fork 0
Substitute ko
jvim์ ์ ๊ท์, ์ปค์คํ ๊ตฌ๋ถ์, ๋ฒ์ ์ง์ , JSONPath ๊ธฐ๋ฐ ๊ตฌ์กฐ์ ์นํ์ด ๊ฐ๋ฅํ vim ์คํ์ผ ์นํ ๋ช ๋ น์ ์ง์ํฉ๋๋ค.
:[๋ฒ์]s/ํจํด/๋์ฒด๋ฌธ์์ด/[ํ๋๊ทธ]
| ๋ช ๋ น | ์ค๋ช |
|---|---|
:s/old/new/ |
ํ์ฌ ์ค์์ ์ฒซ ๋ฒ์งธ ๋งค์น ์นํ |
:s/old/new/g |
ํ์ฌ ์ค์์ ๋ชจ๋ ๋งค์น ์นํ |
:%s/old/new/g |
์ ์ฒด ํ์ผ์์ ๋ชจ๋ ๋งค์น ์นํ |
:N,Ms/old/new/g |
N~M ์ค์์ ๋ชจ๋ ๋งค์น ์นํ (1๋ถํฐ ์์) |
s ๋ฐ๋ก ๋ค์์ ๋ฌธ์๊ฐ ๊ตฌ๋ถ์๊ฐ ๋ฉ๋๋ค. ํจํด์ด๋ ๋์ฒด๋ฌธ์์ด์ /๊ฐ ํฌํจ๋ ๋ ์ ์ฉํฉ๋๋ค:
:s#old#new#g โ #์ ๊ตฌ๋ถ์๋ก ์ฌ์ฉ
:s|old|new|g โ |์ ๊ตฌ๋ถ์๋ก ์ฌ์ฉ
:s@http://@https://@g โ @๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋์ ์ด์ค์ผ์ดํ ํํผ
ํจํด์ด๋ ๋์ฒด๋ฌธ์์ด ์์ ๊ตฌ๋ถ์ ๋ฌธ์๊ฐ ํ์ํ๋ฉด \๋ก ์ด์ค์ผ์ดํํฉ๋๋ค:
:s/path\/to/path\/from/g โ "path/to"๋ฅผ "path/from"์ผ๋ก ์นํ
:s#a\#b#c\#d#g โ "a#b"๋ฅผ "c#d"๋ก ์นํ
์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋ก์ง์ s ์ดํ ํ
์คํธ๋ฅผ ์ค์บํ์ฌ ํํธ ๋ฐฐ์ด์ ๊ตฌ์ถํฉ๋๋ค: \๊ตฌ๋ถ์๋ฅผ ๋ง๋๋ฉด ๊ตฌ๋ถ์๋ฅผ ๋ฆฌํฐ๋ด ๋ฌธ์๋ก ์ฒ๋ฆฌํฉ๋๋ค.
| ํ๋๊ทธ | ์ค๋ช |
|---|---|
g |
์ ์ญ โ ๊ฐ ์ค์์ ๋ชจ๋ ๋ฐ์์ ์นํ (์ด๊ฒ ์์ด๋ ์ค๋น ์ฒซ ๋ฒ์งธ ๋งค์น๋ง ์นํ) |
i |
๋์๋ฌธ์ ๋ฌด์ ๋งค์นญ |
ํ๋๊ทธ ์กฐํฉ ๊ฐ๋ฅ: :s/old/new/gi
ํจํด์์ ์ ์ฒด Python ์ ๊ท์ ๋ฌธ๋ฒ์ด ์ง์๋ฉ๋๋ค:
:s/(\w+)/[\1]/g โ ๊ฐ ๋จ์ด๋ฅผ ๋๊ดํธ๋ก ๊ฐ์ธ๊ธฐ (๊ทธ๋ฃน ์บก์ฒ)
:%s/^\s+//g โ ์์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐ
:s/(\d{4})-(\d{2})/\2-\1/g โ ์ฐ๋-์ ํ์ ๋ฐ๊พธ๊ธฐ
๋์ฒด๋ฌธ์์ด์์ ๊ทธ๋ฃน ์ฐธ์กฐ \1, \2 ๋ฑ์ด ์ง์๋ฉ๋๋ค.
| ๋ฒ์ | ์ค๋ช |
|---|---|
| (์์) | ํ์ฌ ์ค๋ง |
% |
์ ์ฒด ํ์ผ |
N,M |
N~M ์ค (1๋ถํฐ ์์, ์ ํจ ๋ฒ์๋ก ํด๋จํ) |
:%s/TODO/DONE/g โ ์ ์ฒด ํ์ผ
:2,10s/from/to/g โ 2~10๋ฒ ์ค
:1,1s/old/new/ โ ์ฒซ ๋ฒ์งธ ์ค๋ง
๊ฒ์ ํจํด์ด $. ๋๋ $[๋ก ์์ํ๋ฉด ์์ ํ
์คํธ ๋์ JSON ๊ตฌ์กฐ์ ๋ํด ์นํํฉ๋๋ค. =์ ์ ๋ฌด์ ์์น์ ๋ฐ๋ผ ์ธ ๊ฐ์ง ๋ชจ๋๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค:
ํจํด: = ์ ๋ฏธ์ฌ ์๋ JSONPath
๊ฒฝ๋ก์ ๋งค์นญ๋๋ JSON ํค์ ์ด๋ฆ์ ๋ณ๊ฒฝํฉ๋๋ค.
:s/$.name/username/g โ ๋ฃจํธ์์ "name"์ "username"์ผ๋ก ๋ณ๊ฒฝ
:s/$..name/label/g โ ๋ชจ๋ ๊น์ด์ "name" ํค๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ณ๊ฒฝ
:s/$.users[*].name/fullName/g โ ๊ฐ ์ฌ์ฉ์ ๊ฐ์ฒด์ "name" ๋ณ๊ฒฝ
๊ฒฝ๋ก์ ๋ง์ง๋ง ์ธ๊ทธ๋จผํธ๋ง ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ฒฝ๋ก๋ ๋์ ๋๋ฆฌ ํค๋ก ํด์๋์ด์ผ ํฉ๋๋ค (๋ฐฐ์ด ์ธ๋ฑ์ค๊ฐ ์๋).
ํจํด: =๋ก ๋๋๋ JSONPath (ํํฐ ๊ฐ ์์)
๋งค์นญ ๊ฒฝ๋ก์ ๋ชจ๋ ๊ฐ์ ์นํํฉ๋๋ค.
:s/$.name=/Bob/g โ ๋ฃจํธ "name" ๊ฐ์ "Bob"์ผ๋ก ์ค์
:s/$..status=/active/g โ ๋ชจ๋ "status" ๊ฐ์ "active"๋ก ์ค์
:s/$.users[*].age=/0/g โ ๋ชจ๋ ์ฌ์ฉ์ ๋์ด๋ฅผ 0์ผ๋ก ์ด๊ธฐํ
:s/$..enabled=/true/g โ ๋ชจ๋ "enabled"๋ฅผ true๋ก ์ค์
ํจํด: =๊ฐ ํํฐ๊ฐ ์๋ JSONPath
ํํฐ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ๋ง ์นํํฉ๋๋ค.
:s/$..status="draft"/review/g โ "draft" ์ํ๋ง "review"๋ก ์นํ
:s/$..count=0/1/g โ 0์ธ ์นด์ดํธ๋ฅผ 1๋ก ์นํ
:s/$..enabled=false/true/g โ ๋นํ์ฑํ๋ ๋ชจ๋ ํ๋๊ทธ๋ฅผ ํ์ฑํ
๋์ฒด ๊ฐ์ ์๋์ผ๋ก ํ์ ์ด ๊ฐ์ง๋ฉ๋๋ค:
| ์ ๋ ฅ | ๊ฐ์ง ํ์ | JSON ๊ฐ |
|---|---|---|
null |
null | null |
true |
๋ถ๋ฆฌ์ธ | true |
false |
๋ถ๋ฆฌ์ธ | false |
42 |
์ซ์ | 42 |
3.14 |
์ซ์ | 3.14 |
hello |
๋ฌธ์์ด | "hello" |
"hello" |
๋ฌธ์์ด (์ด๋ฏธ ๋ฐ์ดํ) | "hello" |
๊ฐ์ง ๋ก์ง:
-
null,true,falseโ ๊ทธ๋๋ก ์ ๋ฌ - float๋ก ํ์ฑ ๊ฐ๋ฅ โ ๊ทธ๋๋ก ์ ๋ฌ
- ์ด๋ฏธ ๋ฐ์ดํ๋ก ๊ฐ์ธ์ง โ ๊ทธ๋๋ก ์ ๋ฌ
- ๋๋จธ์ง โ
json.dumps()๋ก JSON ์ธ์ฝ๋ฉ
JSONPath๊ฐ ์ฌ๋ฌ ์์น์ ๋งค์นญ๋ ๋ ์นํ ์์ง์ ์ฌ์ฉ๋ ์์น((ํ, ์ด) ์)๋ฅผ ์ถ์ ํ์ฌ ์ค๋ณต ์นํ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ฏธ ์นํ๋ ์์น๋ฉด (ํ, ์ด+1)๋ถํฐ ๋ค์ ๋ฐ์์ ๊ฒ์ํฉ๋๋ค.
JSONL ๋ชจ๋์์ JSONPath ์นํ์ ๊ฐ ๋ ์ฝ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํฉ๋๋ค:
- ๋ด์ฉ์ด ๋ธ๋ก(์ฐ์๋ ๋น์ด์์ง ์์ ์ค ๊ทธ๋ฃน)์ผ๋ก ๋ถํ
- ๊ฐ ๋ธ๋ก์ด ๋ณ๋์ JSON ๋ฌธ์๋ก ํ์ฑ
- JSONPath ํด์๊ณผ ์นํ์ด ๋ ์ฝ๋๋ณ๋ก ์คํ
- ๊ฒฐ๊ณผ๊ฐ ๋ธ๋ก ์์ ์คํ์ ์ ์ฌ์ฉํ์ฌ ์๋ํฐ ๋ผ์ธ ์์น๋ก ๋งคํ
- ๊ฐ์ ํจํด์ด ๋ชจ๋ ๋ ์ฝ๋์์ ๋งค์นญ ๋ฐ ์นํ ๊ฐ๋ฅ
๋์ฒด ๋ฌธ์์ด์ ์ค๋ฐ๊ฟ(๋ฆฌํฐ๋ด \n)์ด ํฌํจ๋๋ฉด:
- ๊ฒฐ๊ณผ๊ฐ ์ค๋ฐ๊ฟ์ผ๋ก ๋ถํ
- ๋ผ์ธ ์ธ๋ฑ์ค๊ฐ ๊ทธ์ ๋ง๊ฒ ์กฐ์
- ๋ชจ๋ ์ ๊ธฐ์ ์ ํ ๋ฌธ์์ด์ด ํด์ ๋จ (๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก)
๋ชจ๋ ์นํ์ u๋ก ์คํ ์ทจ์ํ ์ ์์ต๋๋ค. ์ ์ฒด ์นํ ์์
(์ํฅ๋ฐ์ ๋ชจ๋ ์ค)์ด ๋จ์ผ undo ํฌ์ธํธ๋ก ๊ธฐ๋ก๋ฉ๋๋ค.
๋งค์น๊ฐ ์์ผ๋ฉด undo ์คํ ํญ๋ชฉ์ด ์๋์ผ๋ก ์ ๊ฑฐ๋ฉ๋๋ค (๋ฌด๋์์ด ํ์คํ ๋ฆฌ๋ฅผ ์ค์ผ์ํค์ง ์์).
| ์ํฉ | ๋ฉ์์ง |
|---|---|
| ์ฑ๊ณต | "N substitution(s)" |
| ๋งค์น ์์ | "Pattern not found: ํจํด" |
| ์นํ ํ ์๋ชป๋ JSON | "Invalid JSON: ๋ฉ์์ง (line N)" |
| ์๋ชป๋ JSONPath | "Invalid JSONPath: ์ค๋ฅ" |
| ๊ฒฝ๋ก๊ฐ ์ปจํ ์ด๋๋ง ๋งค์นญ | "JSONPath matches only objects/arrays (not substitutable)" |