2012-04-30 3 views
4

필자는 markdown으로 변환 할 일련의 텍스트 파일을 보유하고 있습니다. 선행 공백을 제거하고 모든 파일의 첫 번째 줄에 해시 기호를 추가하려고합니다. 내가 이것을 실행하면 :SED를 사용하여 여러 파일에서 n 번째 줄을 어떻게 변경합니까?

sed -i.bak '1s/ *\(.*\)/\#\1/g' *.md 

첫 번째 파일의 첫 번째 줄을 변경하고 나머지 파일을 변경하지 않고 모두 처리합니다.

무엇이 누락되어 여러 파일의 n 번째 줄에서 무언가를 검색하고 바꿀 수 있습니까? OSX 10.7

+0

시스템의'sed '버전은 무엇입니까? 그것은 우분투 12.04에서 잘 작동합니다. – kev

+0

@kev 그렇습니다. 그러나 실제로는 문서화 된 동작과 반대되는데, 이것은 개별 파일을 별도의 스트림으로 처리하기 위해'-s' 플래그가 필요하다는 것을 나타냅니다. 즉, OS X은 GNU 도구를 사용하지 않으므로 쉘 루핑 방식을 사용해야 할 것입니다. –

답변

5

에 Bash를 이용한

문제 어느 하나의 스트림으로 파일 수, 따라서 줄 번호 오프셋이 기본 치료로 나오지는 첫 번째 파일의 시작에 상대적이다. GNU가 나오지 들어

, 당신은이 동작을 수정하려면 -s (--separate) 플래그를 사용할 수 있습니다

sed -s -i.bak '1s/^ */#/' *.md 

... 또는 비 GNU가 (맥 OS X에 포함) 나오지도 함께, 당신은 파일을 통해 루프를 할 수 있고 한 번 각 당 호출 : 정규식 여기에 간단 조금입니다

for f in *.md; do sed -i.bak '1s/^ */#/' "$f"; done 

하는 것으로 - 변경하지 않을 라인의 일부를 일치 할 필요.

+0

감사합니다. 정확히 모든 파일을 처리해야했습니다. 첫 번째 줄을 목표로 두 번째 대답을 변경했습니다. f in * .md; sed -i.bak '1s/^ */#/g' "$ f"; done – FrederickYocum

+0

@FrederickYocum 감독에 대해 지적 해 주셔서 감사합니다. 나는 이것을 편집 결과로 적용했다. –

0

xargs를 당신을 위해 트릭을 할 것입니다 :

http://en.wikipedia.org/wiki/Xargs

제거 * 귀하 나오지 명령의 끝에서 .md, 다음 한 번에 하나씩 파일을 수집하고 그들을 보낼 xargs를를 사용하여 sed 명령을 하나의 엔티티로 사용하게되어서 죄송합니다. wikiPedia 기사에서 알아야 할 내용을 보여 주어야합니다. 당신이 라인의 시작, 그리고 여러 번에서 뭔가를 대체 할 wan't 때문에

+0

문제는 그것들을 단일 엔티티로서 sed에 보내지 않는다는 것입니다. 문제는 기본적으로 sed가 모든 파일을 단일 스트림으로 취급하므로 라인 번호 오프셋은 첫 번째 파일의 시작에 상대적이라는 점입니다. –

+0

@Charles Duffy : 대답에 넣어주세요. –

+0

@KarolyHorvath 완료. –

0
sed -rsi.bak '1s/^/#/;s/^[ \t]+//' *.md 

당신은 명령 (들)의 끝에서 (lobally) g이 필요하지 않습니다.

선행 공백 (및? : = \ t 탭)에 대한 두 번째 명령과 별도로 줄 1 (1s ...)을 수정하는 명령을 세미콜론으로 사용하십시오. 첫 줄에서 공백을 제거하려면 다음 순서로 전환하십시오.

sed -rsi.bak 's/^[ \t]+//;1s/^/#/' *.md 

필요없는 경우 \ t를 제거하십시오. 그런 다음 그룹도 필요하지 않습니다.

-r 정규 표현식의 특수 처리를 알리는 플래그입니다. 이 경우 플러스를 가릴 필요가 없습니다.

+0

좋은 지적입니다. 질문이 쓰여진 영어 산문은 선행 공백 수정이 첫 줄이 아닌 모든 줄에 적용되는지에 관해서는 모호합니다 (비록 다른 사람들이 대답하고, 나 자신을 포함하여 반대 의미를 가졌지 만, 두 가지 변경 사항 모두에 적용되도록 의도 된 "첫 번째 라인"제한이 있음). 원래 의도 한 의미에서 원저자의 설명을 얻는 데 관심이 있습니다. –

+0

... 사실,이 해석에 대한 질문에서 "파일의 나머지 부분은 변하지 않은 채로"문구가 끊어지는 것 같습니다. –

+0

아 - 지금은 이해합니다. 필자의 해석은'모든 공백을 없애고 싶습니다. (모든 파일의 첫 줄에 해쉬 기호를 추가하십시오.) '였습니다.하지만 이제는 해석이 필요합니다. (공백을 제거하고 해쉬 기호를 추가하고 싶습니다.) 예제 코드를 보면, 모든 파일의 첫 줄이 나에게 그럴듯하게 보인다. 그렇다면 sed 옵션에 대해서만 모든 것이있었습니다. –

관련 문제