2010-05-10 5 views
1
내가 명령 줄 스크립트를 사용하여 패치 스크립트를 변환하고있어

을 사용 나오지도 - 두 줄이 좋아하는 조합이있다 이러한 스크립트 내에서 :여러 줄은 역 참조

--- /dev/null 
+++ filename.txt 

로 변환 할 필요가있다 : 처음

--- filename.txt 
+++ filename.txt 

나는 시도했다 :

less file.diff | sed -e "s/---\/dev\null\n+++ \(.*\)/--- \1\n+++ \1/" 

그러나 나는 multiline-handling가 많은 mo 다. 이것은 첫 번째 줄을 삭제

(read; read x FILE; echo "--- $FILE"; echo "+++ $FILE"; cat) < file.diff 

:

어떤 도움에 감사드립니다 :(나오지 복잡한 ...

답변

2

또한 전체 파일을 홀딩 버퍼로 가져온 다음 홀딩 버퍼를 패턴 버퍼에 복사하고 전체 파일에 정규 표현식을 적용 할 수 있습니다 (\ 엔).

은 다음과 같습니다

sed -n '1h;1!H;${;g;s/a/b/g;p;}' 

일부 설명 :!

  • 1 시간 - 첫 번째 줄의 카피가 처음 에 복사하면 채 버퍼
  • 1 H - 그렇지 않으면 첫 번째 줄의 APPEND (H를)를 보유 버퍼에 저장
  • $ {...} - 마지막 행할 경우
  • ; g; s/a/b/g; p; - 그램 복사 패턴 버퍼에 들고 S/A/B/정규식 매치 않는 g (이 경우, 대체 'A' 'B')와, P 인쇄 결과
-1

재 당신은 서브 쉘의 명령 SED 및 문자열 함께 몇 가지를 건너 뛸 수 두 번째 줄에서 파일 이름을 읽고 처음 두 줄을 인쇄 한 다음 cat을 사용하여 나머지 파일을 변경하지 않고 표시합니다.

당신은 같은 생각을하고 awk 스크립트와 함께 할 수 있습니다 :

awk 'NR==2 {print "---", $2; print "+++", $2} NR>2 {print}' file.diff 

내가 모두에서 공통적 인 생각은 단순히 돌아가하려고하기보다는 첫 번째 줄에 자신을 인쇄하는 것이 더 쉽습니다 것으로 추측 검색/대체를 수행합니다.

1

감사 - 실제로 내가 생각 해낸 무엇 :에서 N (내가 바로 그것을 가지고있는 경우) 기본적으로

sed -e "N; s/.*null\n+++ \(.*\)/--- \1\n+++ \1/" filename.txt 

방금 ​​두 줄을 병합 두 줄 대신를 사용을 비교 한을 가능하게 나오지도 알려줍니다 시작 하나 - 그 외 모든 것은 순수한 정규식 일뿐입니다 ...