어떤 문서에 다른 문서의 내용을 일부만 가져오기

라스코니의 이미지

안녕하세요. 어제 질문했던 내용의 연장선인데 data import 방법이 바뀌었습니다.

값이 들어 있는 아래와 같은 data.txt가 있습니다.
DATASTART

VALUE AAA
VALUE BBB
VALUE CCC

AAA = 10
BBB = 100
CCC = 1000

DATAEND

다른 cmd.txt가 아래와 같이 있는데 위의 data.txt를 DATASTART, DATAEND, VALUE line 만 빼고 이문서 (또는 새로운 문서에) 붙여 넣기를 하고 싶습니다.
COMMAND START

COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND

COMMAND END

원하는 결과는 아래와 같습니다.
COMMAND START

VALUE AAA
VALUE BBB
VALUE CCC

AAA = 10 <== 이부분만 가져옴
BBB = 100 <== 이부분만 가져옴
CCC = 1000 <== 이부분만 가져옴

COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND

COMMAND END

도움 부탁드립니다.

ymir의 이미지

$ cat data.txt 
DATASTART
 
VALUE AAA
VALUE BBB
VALUE CCC
 
AAA = 10
BBB = 100
CCC = 1000
 
DATAEND
$ cat cmd.txt 
COMMAND START
 
COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
 
COMMAND END
$ (echo "" && grep = data.txt) > val.txt
$ sed '/COMMAND START/r val.txt' cmd.txt 
COMMAND START
 
AAA = 10
BBB = 100
CCC = 1000
 
COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
 
COMMAND END

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

ymir님. 감사합니다. 잘 됩니다!!
(echo "" && grep = data.txt) 가 어떤 동작을 해서 "AAA = 10" 만 추출할 수 있었는지 설명해 주실 수 있나요?

ymir의 이미지

빈 줄 하나 먼저 출력하고, data.txt 에서 = 가 들어 있는 라인만 뽑아서 val.txt 로 저장한 겁니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

혹시 이렇게도 가능한가요?

data.txt 파일이 아래와 같고,
DATASTART

VALUE AAA //AAA value
VALUE BBB //BBB parameter
VALUE CCC <== 이건 주석 없음

AAA = 10
BBB = 100
CCC = 1000

DATAEND

cmd.txt가 아래와 같을 때
COMMAND START

COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND

COMMAND END

아래와 같이 생성되도록 가능한가요?

COMMAND START

VALUE AAA = 10 <= 주석(//)이 있으면 날리고 data.txt의 값만 대입
VALUE BBB = 100
VALUE CCC = 1000

COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND

COMMAND END

부탁드립니다.

ymir의 이미지

$ ( echo "" && grep = data.txt | sed 's/^/VALUE /g' ) > val.txt
$ sed '/COMMAND START/r val.txt' cmd.txt
COMMAND START
 
VALUE AAA = 10
VALUE BBB = 100
VALUE CCC = 1000
 
COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
 
COMMAND END 

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

ymir님. cmd.txt와 data.txt 형태가 조금 바뀌었습니다.

아래가 data.txt 파일입니다.
DATASTART

VALUE AAA TYPE1 //AAA value <== TYPE이 추가되었습니다
VALUE BBB TYPE2 //BBB parameter
VALUE CCC TYPE3 <== 이건 주석 없음

AAA = 10
BBB = 100
CCC = 1000

DATAEND

아래가 cmd.txt 파일입니다.
COMMAND START

VALUE AAA TYPE1 //AAA value
VALUE BBB TYPE2 //BBB parameter
VALUE CCC TYPE3

COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND

COMMAND END

이게 아래와 같이 바뀌어야 합니다.

COMMAND START

VALUE AAA TYPE1 = 10 <= 주석(//)이 있으면 날리고 data.txt의 값만 대입
VALUE BBB TYPE2 = 100
VALUE CCC TYPE3 = 1000

COMMAND AAA SEND
CMMAND A1=AAA, A2=BBB, DELAY=CCC SEND

COMMAND END

data.txt, cmd.txt 모두도 같은 형태 선언이 들어가게 되었습니다.
도와 주셔서 감사합니다.

ymir의 이미지

$ cat data.txt 
DATASTART
 
VALUE AAA TYPE1 //AAA value <== TYPE이 추가되었습니다
VALUE BBB TYPE2 //BBB parameter
VALUE CCC TYPE3
 
AAA = 10
BBB = 100
CCC = 1000
 
DATAEND
$ cat cmd.txt 
COMMAND START
 
VALUE AAA TYPE1 //AAA value
VALUE BBB TYPE2 //BBB parameter
VALUE CCC TYPE3
 
COMMAND AAA SEND
COMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
 
COMMAND END
$ grep -Po '[^ ]+ = .*' data.txt | sed 's/ //g'
AAA=10
BBB=100
CCC=1000
$ eval $(grep -Po '[^ ]+ = .*' data.txt | sed 's/ //g')
$ cat cmd.txt | sed 's/VALUE \([^ ]\+\) \([^ ]\+\).*/VALUE \1 \2 = \$\1/g' | tee new_cmd.txt
COMMAND START
 
VALUE AAA TYPE1 = $AAA
VALUE BBB TYPE2 = $BBB
VALUE CCC TYPE3 = $CCC
 
COMMAND AAA SEND
COMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
 
COMMAND END
$ cat new_cmd.txt | while read -r line; do eval echo $line; done
COMMAND START
 
VALUE AAA TYPE1 = 10
VALUE BBB TYPE2 = 100
VALUE CCC TYPE3 = 1000
 
COMMAND AAA SEND
COMMAND A1=AAA, A2=BBB, DELAY=CCC SEND
 
COMMAND END

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

라스코니의 이미지

정말 감사합니다. ymir님.
좀 막막했는데 덕분에 다 해결되었습니다. 이걸 수백개 파일에 적용하는게 남았지만요.
아래와 같이 bash 스크립트로 돌릴 예정입니다.

#!/bin/bash
grep -Po '[^ ]+ = .*' data.txt | sed 's/ //g' > /dev/null
eval $(grep -Po '[^ ]+ = .*' data.txt | sed 's/ //g')
cat cmd.txt | sed 's/VALUE \([^ ]\+\) \([^ ]\+\).*/VALUE \1 \2 = \$\1/g' | tee new_cmd.txt > /dev/null
cat new_cmd.txt | while read -r line; do eval echo $line; done > final_cmd.txt

감사합니다!!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.