๐ŸŒ‹ VIM ์„ ์ด์šฉํ•˜์—ฌ XML to JSON Parsing

ALL Missing Semester TIL VIM JSON XML REGEX Posted by Sunio on January 04, 2021 · 4 mins read

missing-semester 3์ผ ์ฐจ, Practice 8๋ฒˆ

Tools

  • OS : Windows10

VIM / WSL / LINUX

1. Prologue


Vim์€ Linux์˜ ๋Œ€ํ‘œ์ ์ธ ํŽธ์ง‘๊ธฐ์ธ vi์™€ ํ˜ธํ™˜๋˜๋Š” ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ์ด๋‹ค.
Vim์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๊ณ  ์ด๋ฅผ ์ถ”๊ฐ€/์ˆ˜์ •/์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์‹ค ์•„์ง ๋‚˜์—๊ฒŒ Vim์€ input์„ ํ‚ค๋ณด๋“œ๋กœ๋งŒ ๋ฐ›๋Š” ๋ฌด์‹ํ•œ ๋ฉ”๋ชจ์žฅ์ผ ๋ฟ์ด๋‹ค.
์ข€ ๋” ์นœํ•ด์ ธ๋ณด๋„๋ก ๋…ธ๋ ฅํ•ด๋ณด์ž.
์™œ ์“ฐ๋Š”๊ฑฐ์•ผ ๊ทผ๋ฐ..

2. Issue


์—ฌ๊ธฐ example-data.xml์ด ์žˆ๋‹ค.

<people>
  <person>
    <name>Johnny Zhang Jr.</name>
    <email>amyalvarez@cole.com</email>
  </person>
  <person>
    <name>Edward Cook</name>
    <email>dsparks@alvarez-dunn.com</email>
  </person>
  <person>
    <name>Stephen Sweeney</name>
    <email>dlewis@gmail.com</email>
  </person>
  <person>
    <name>Krystal Riley</name>
    <email>jflores@wright.biz</email>
  </person>
</people>
(์‹ค์ œ๋กœ๋Š” 1000์ค„์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์ด์ง€๋งŒ ๊ทธ ์ค‘ ์ผ๋ถ€๋งŒ ์ž˜๋ผ ์‹ค์Šตํ•˜๋„๋ก ํ•˜์ž.)

XML์€ markup language๋กœ์„œ โ€˜ํƒœ๊ทธโ€™ ๋‚ด์— ์ธ๋ผ์ธ์œผ๋กœ ์ •๋ณด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์š”์†Œ(element)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์œ„ ์˜ˆ์ œ์—์„œ์˜ element๋Š” people > person > {name,email} ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

JSON์€ JavaScript Object Notation์˜ ์•ฝ์ž๋กœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ๊ตํ™˜ํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ _โ€˜ํ˜•์‹โ€™_์˜ ํ•˜๋‚˜๋ผ๊ณ  ์•Œ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
์ฐธ๊ณ ๋กœ, XML์€ EXtensible Markup Language์˜ ์•ฝ์ž์ด๋‹ค. (link :: ๋‘ ์‚ฌ์ด์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ )

์•„๋ฌดํŠผ, ์šฐ๋ฆฌ๋Š” ์ด ๋‘˜๊ฐ„์˜ ๋ณ€ํ™˜์„ ํ•ด์•ผํ•œ๋‹ค. ๊ตฌ์กฐ์˜ ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ 6.Reference ์˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜๊ณ , ์ด์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž.

3. Resolve


๊ธ€์“ฐ๋Š” ๋ณธ์ธ๋„ ์œ„ ๋‚ด์šฉ์„ ์ž˜ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ํ•˜๋‚˜์”ฉ ํ•ด์„ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ, ์„ค๋ช…์„ ํ•˜๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

  • ์ผ๋‹จ Vim์œผ๋กœ example-data.xml์„ ์—ด์–ด๋ณด์ž.
<people>
  <person>
    <name>Johnny Zhang Jr.</name>
    <email>amyalvarez@cole.com</email>
  </person>
  ...
</people>
  • ์šฐ๋ฆฌ๋Š” ์ด์ œ Sed Regex๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ํ…์ŠคํŠธ๋ฅผ ๋ถ„ํ•ดํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ(Sed)์˜ ํŠน์ •ํ•œ ๊ทœ์น™์„ ๊ฐ€์ง„ ๋ฌธ์ž์—ด์˜ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•(Regex, ์ •๊ทœํ‘œํ˜„์‹์€ ์—ฌ๋Ÿฌ language์—์„œ ์ง€์›ํ•œ๋‹ค)์œผ๋กœ ์„ธํ•œ ๋‚ด์šฉ์€ ๋„ˆ๋ฌด๋‚˜ ๋งŽ์•„ ์ƒ๋žตํ•œ๋‹ค. ๐Ÿ™ƒ
 : g/people/d 
 : %s/<person>/{/g 
 : %s/<\/person>/},/g 
 : %s/<name>\(.*\)<\/name>/"name": "\1",/g 
 : %s/<email>\(.*\)<\/email>/"email": "\1",/g
  • ์ปค๋งจ๋“œ ์ž…๋ ฅ ๋ชจ๋“œ์—์„œ ์œ„์˜ ์ปค๋งจ๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅํ•ด์ค€๋‹ค.

: g/people/d ์ปค๋งจ๋“œ๋Š” ๋ชจ๋“  ๋ผ์ธ์— ์ ์šฉํ•˜์—ฌ(g) โ€œpeopleโ€ ์„ ์ฐพ๊ณ  line delete(d) ํ•œ๋‹ค.
: %s/<person>/{/g ์ปค๋งจ๋“œ๋Š” ๋ชจ๋“  ๋ผ์ธ์˜ โ€˜'์„ '{'๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

: %s/<\/person>/},/g ์œ„ ์ปค๋งจ๋“œ์™€ ๊ฐ™๊ณ , ์—ญ์Šฌ๋ž˜์‰ฌ(โ€˜')๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์Šฌ๋ž˜์‰ฌ(โ€˜/โ€™)๋ฅผ ๋ฌธ์ž๋กœ ๋ฐ›๊ธฐ ์œ„ํ•จ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ ๋ธŒ๋ผ์ผ“ ๊ตฌ๋ถ„์„ ์œ„ํ•œ delimeter โ€˜,โ€™๋„ ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

: %s/<name>\(.*\)<\/name>/"name":"\1",/g ์ปค๋งจ๋“œ๋Š” <name>*</name> ์„ "name" : "*" ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. (\1 ์€ ์ฒซ๋ฒˆ์งธ backreference๋ฅผ ์˜๋ฏธํ•œ๋‹ค.)

์ด ํ›„, manually ํ•˜๊ฒŒ ๋งˆ์ง€๋ง‰ ์‰ผํ‘œ(,)๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋Œ€๊ด„ํ˜ธ(โ€˜[โ€™,โ€™]โ€™)๋ฅผ ์•ž๋’ค๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋๋‚œ๋‹ค.

[
  {
    "name": 'Johnny Zhang Jr.',
    "email": 'amyalvarez@cole.com'
  },
  {
    "name": 'Edward Cook',
    "email": 'dsparks@alvarez-dunn.com'
  },
  {
    "name": 'Stephen Sweeney',
    "email": 'dlewis@gmail.com'
  },
  {
    "name": 'Krystal Riley',
    "email": 'jflores@wright.biz'
  }
]
  • JSON ํ˜•์‹์œผ๋กœ ์™„์„ฑ๋˜์—ˆ๋‹ค.

4. Code


    1. Resolve ์ฐธ๊ณ 

5. Post Script


vim์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋Š” ๋‹จ๊ณ„์ธ๋ฐ ์–ด์งธ regex์— ๋Œ€ํ•ด์„œ ๋” ๊ณต๋ถ€๋ฅผ ํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์–ธ์  ๊ฐ€ ์ฃผ๋ ฅ์œผ๋กœ vim์„ ์“ฐ๊ฒŒ ๋œ๋‹ค๋ฉด ์˜ค๋Š˜ ๋ฐฐ์šด๊ฑธ ๋‹ค์‹œ ์จ๋จน์„ ๋‚ ์ด ์˜ค๊ฒ ์ง€โ€ฆ ์ƒ์ƒ..๐Ÿค’

6. Reference


missing-semester :: Lecture 3. VIM editor
XML์ด ๋ญ์•ผ? :: XML ๊ตฌ์กฐ
JSON์ด ๋ญ์•ผ? :: JSON
Sed / Regex :: Sed_manual
VIM Basic search and replace :: vim_tip_wiki


โ€ข 0 Comments