2015-01-29 1 views
4

나는 다음과 같이 YAML의 frontmatter 메타 데이터를 포함 인하 파일이 있습니다마크 다운 파일에서 YAML 프론트 매터를 제거하는 방법은 무엇입니까?

--- 
title: Something Somethingelse 
author: Somebody Sometheson 
--- 

을하지만 YAML은 다양한 폭이다. sed과 같은 Posix 명령을 사용하여 프런트 맵이 파일의 시작 부분에있을 때이를 제거 할 수 있습니까? ------ 사이의 모든 것을 제거하지만 다른 곳에서는 ---이있는 경우 나머지 파일은 무시합니다.

+0

입력 및 출력을 지정할 수 있습니까? 내 이해는'---'과'---'안의 줄을 제거하기를 원한다. 그렇다면'sed -i -n '/ --- /,/---/d'[file]' – qqibrow

+0

qqibrow를 써라. 쓰여진대로'sed' 명령은 너무 욕심 거리며 묻힌 것 이상을 제거 할 것이다. . – user3439894

답변

7

첫 번째 줄에서 시작하는 첫 번째 ---- 숨겨진 된 블록을 제거하려는 의미를 이해합니다. 이 경우,

sed '1 { /^---/ { :a N; /\n---/! ba; d} }' filename 

이것은 :

1 {    # in the first line 
    /^---/ {  # if it starts with --- 
    :a   # jump label for looping 
    N   # fetch the next line, append to pattern space 
    /\n---/! ba; # if the result does not contain \n--- (that is, if the last 
       # fetched line does not begin with ---), go back to :a 
    d   # then delete the whole thing. 
    } 
} 
       # otherwise drop off the end here and do the default (print 
       # the line) 

당신이 ---abc 정도로 시작하는 라인을 처리하는 방법에 따라 약간 (아마도에서 $를 추가 패턴을 변경해야 할 수도 있습니다 전체 줄이 --- 인 경우에만 끝이 일치 함). 거기에 귀하의 정확한 요구 사항에 약간 명확하지 않습니다. 전면 물질과 단지 전면 물질을 제거하려면

0

"또는 무언가"가 perl이 아니더라도 괜찮습니다.

단순히 두 인스턴스 후 인쇄 "---"발견되었습니다 :

perl -ne 'if ($i > 1) { print } else { /^---/ && $i++ }' yaml 

또는 약간 짧은 당신은 학대 괜찮다면?

perl -ne '$i > 1 ? print : /^---/ && $i++' yaml 

: 흐름 제어 인라인을 교체하려면 -i을 반드시 포함하십시오.

2

간단히 실행할 수 있습니다 :

sed '1{/^---$/!q;};1,/^---$/d' infile 

을 첫 번째 줄 --- 일치하지 않는 경우, sed 것이다 q UIT을; 그렇지 않으면 elete 1 st에서부터 --- (즉 전체 앞부분)에 일치하는 다음 줄까지의 모든 줄을 포함합니다.

+0

나는이 작업을하기 위해 "q"다음에 세미콜론을 써야했다 : sed '1 {/^--- $ /! q;}; 1,/^ --- $/d' –

+0

@JBRainsberger - gnu sed 구문을 사용했지만 휴대용 방식은 중괄호 앞에 세미콜론으로 시작합니다. 헤드 업에 감사드립니다! –

관련 문제