Skip to content

Substitute ko

edgar edited this page Feb 23, 2026 · 1 revision

์น˜ํ™˜

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/       โ†’ ์ฒซ ๋ฒˆ์งธ ์ค„๋งŒ

JSONPath ์น˜ํ™˜

๊ฒ€์ƒ‰ ํŒจํ„ด์ด $. ๋˜๋Š” $[๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์›์‹œ ํ…์ŠคํŠธ ๋Œ€์‹  JSON ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. =์˜ ์œ ๋ฌด์™€ ์œ„์น˜์— ๋”ฐ๋ผ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค:

๋ชจ๋“œ 1: ํ‚ค ์ด๋ฆ„ ๋ณ€๊ฒฝ

ํŒจํ„ด: = ์ ‘๋ฏธ์‚ฌ ์—†๋Š” JSONPath

๊ฒฝ๋กœ์— ๋งค์นญ๋˜๋Š” JSON ํ‚ค์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

:s/$.name/username/g           โ†’ ๋ฃจํŠธ์—์„œ "name"์„ "username"์œผ๋กœ ๋ณ€๊ฒฝ
:s/$..name/label/g             โ†’ ๋ชจ๋“  ๊นŠ์ด์˜ "name" ํ‚ค๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ณ€๊ฒฝ
:s/$.users[*].name/fullName/g  โ†’ ๊ฐ ์‚ฌ์šฉ์ž ๊ฐ์ฒด์˜ "name" ๋ณ€๊ฒฝ

๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰ ์„ธ๊ทธ๋จผํŠธ๋งŒ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํ‚ค๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (๋ฐฐ์—ด ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹˜).

๋ชจ๋“œ 2: ๋ฌด์กฐ๊ฑด ๊ฐ’ ์น˜ํ™˜

ํŒจํ„ด: =๋กœ ๋๋‚˜๋Š” 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๋กœ ์„ค์ •

๋ชจ๋“œ 3: ์กฐ๊ฑด๋ถ€ ๊ฐ’ ์น˜ํ™˜

ํŒจํ„ด: =๊ฐ’ ํ•„ํ„ฐ๊ฐ€ ์žˆ๋Š” 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"

๊ฐ์ง€ ๋กœ์ง:

  1. null, true, false โ†’ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ
  2. float๋กœ ํŒŒ์‹ฑ ๊ฐ€๋Šฅ โ†’ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ
  3. ์ด๋ฏธ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์ง โ†’ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ
  4. ๋‚˜๋จธ์ง€ โ†’ json.dumps()๋กœ JSON ์ธ์ฝ”๋”ฉ

์œ„์น˜ ์ค‘๋ณต ์ œ๊ฑฐ

JSONPath๊ฐ€ ์—ฌ๋Ÿฌ ์œ„์น˜์— ๋งค์นญ๋  ๋•Œ ์น˜ํ™˜ ์—”์ง„์€ ์‚ฌ์šฉ๋œ ์œ„์น˜((ํ–‰, ์—ด) ์Œ)๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ค‘๋ณต ์น˜ํ™˜์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์น˜ํ™˜๋œ ์œ„์น˜๋ฉด (ํ–‰, ์—ด+1)๋ถ€ํ„ฐ ๋‹ค์Œ ๋ฐœ์ƒ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

JSONL ์น˜ํ™˜

JSONL ๋ชจ๋“œ์—์„œ JSONPath ์น˜ํ™˜์€ ๊ฐ ๋ ˆ์ฝ”๋“œ์— ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. ๋‚ด์šฉ์ด ๋ธ”๋ก(์—ฐ์†๋œ ๋น„์–ด์žˆ์ง€ ์•Š์€ ์ค„ ๊ทธ๋ฃน)์œผ๋กœ ๋ถ„ํ• 
  2. ๊ฐ ๋ธ”๋ก์ด ๋ณ„๋„์˜ JSON ๋ฌธ์„œ๋กœ ํŒŒ์‹ฑ
  3. JSONPath ํ•ด์„๊ณผ ์น˜ํ™˜์ด ๋ ˆ์ฝ”๋“œ๋ณ„๋กœ ์‹คํ–‰
  4. ๊ฒฐ๊ณผ๊ฐ€ ๋ธ”๋ก ์‹œ์ž‘ ์˜คํ”„์…‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋””ํ„ฐ ๋ผ์ธ ์œ„์น˜๋กœ ๋งคํ•‘
  5. ๊ฐ™์€ ํŒจํ„ด์ด ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์—์„œ ๋งค์นญ ๋ฐ ์น˜ํ™˜ ๊ฐ€๋Šฅ

๋ฉ€ํ‹ฐ๋ผ์ธ ์ฒ˜๋ฆฌ

๋Œ€์ฒด ๋ฌธ์ž์—ด์— ์ค„๋ฐ”๊ฟˆ(๋ฆฌํ„ฐ๋Ÿด \n)์ด ํฌํ•จ๋˜๋ฉด:

  • ๊ฒฐ๊ณผ๊ฐ€ ์ค„๋ฐ”๊ฟˆ์œผ๋กœ ๋ถ„ํ• 
  • ๋ผ์ธ ์ธ๋ฑ์Šค๊ฐ€ ๊ทธ์— ๋งž๊ฒŒ ์กฐ์ •
  • ๋ชจ๋“  ์ ‘๊ธฐ์™€ ์ ‘ํžŒ ๋ฌธ์ž์—ด์ด ํ•ด์ œ๋จ (๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฏ€๋กœ)

Undo

๋ชจ๋“  ์น˜ํ™˜์€ u๋กœ ์‹คํ–‰ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์น˜ํ™˜ ์ž‘์—…(์˜ํ–ฅ๋ฐ›์€ ๋ชจ๋“  ์ค„)์ด ๋‹จ์ผ undo ํฌ์ธํŠธ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

๋งค์น˜๊ฐ€ ์—†์œผ๋ฉด undo ์Šคํƒ ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค (๋ฌด๋™์ž‘์ด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š์Œ).

์ƒํƒœ ๋ฉ”์‹œ์ง€

์ƒํ™ฉ ๋ฉ”์‹œ์ง€
์„ฑ๊ณต "N substitution(s)"
๋งค์น˜ ์—†์Œ "Pattern not found: ํŒจํ„ด"
์น˜ํ™˜ ํ›„ ์ž˜๋ชป๋œ JSON "Invalid JSON: ๋ฉ”์‹œ์ง€ (line N)"
์ž˜๋ชป๋œ JSONPath "Invalid JSONPath: ์˜ค๋ฅ˜"
๊ฒฝ๋กœ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋งŒ ๋งค์นญ "JSONPath matches only objects/arrays (not substitutable)"

English | ํ™ˆ

Clone this wiki locally