2012-01-21 3 views
1

루비에 파일 포함을 구현하는 간단한 방법은 무엇입니까? 텍스트 파일에 {{{stuff.txt}}}가 포함되어 있으면 stuff.txt의 내용이 인라인에 포함됩니다. 나는 이런 식으로 생각했다 :파일을 포함하는 전처리 기

cat prog | ruby -pe 'gsub /{{{.+}}}/, File.open("$0").read' 

... eval() 관련되어 있지만 작동하지 않을 수 있습니다.

답변

1

를 교체를 계산하기 위해 블록을 사용할 필요가 Alex D의 .+은 욕심 많고 가능한 한 많은 문자와 일치합니다. 반면에 .+?은 가능한 한 자로 일치하려고합니다.

Ruby의 명령 줄 -p$_ 변수 값을 업데이트해야합니다. 따라서 gsub 대신 gsub!을 사용하여 사본을 만듭니다. -n을 사용하면 같은 결과를 얻을 수 있습니다.

cat prog | ruby -ne 'puts $_.gsub(/{{{(.+?)}}}/) { File.read $1 }' 
+0

이것은 훌륭한 설명이며 완벽하게 작동합니다. 감사합니다. – mahemoff

2
s.gsub(/{{{(.+?)}}}/) { |m| File.read($1) } 

몇 점 :..

  • 이 사이에는 중요한 차이가 +과 +? . +를 사용하면 너무 많은 문자를 먹는 정규 표현식을 쉽게 만들 수 있습니다. 지적
  • 당신은,

    cat prog | ruby -pe '$_.gsub!(/{{{(.+?)}}}/) { File.read $1 }' 
    

    시도 명령 줄에서 바로 그것을하고 싶은 경우 (이 동적이기 때문에)

+1

또한, 블록 내부에 당신은 $ 0에서 $ 세계 1 변수를 사용할 수 있습니다 : 's.gsub을 (/ \ {\ {\ {(+) \} \} \.?}) {File.read ($ 1)}'(정규 표현식에 그룹핑을 추가 한 것에 유의하십시오.) –

+0

좋은 지적, 감사합니다. –

+1

Ruby의 정규 표현식에서 '{'와 '}'는 특수 문자가 아닙니다. ''{a} '= ~/{a}/# => 0'. – Jan

관련 문제