2012-03-03 2 views
1

bash 스크립트를 통해 파일에 3 행을 추가해야합니다. sedawk은 설치할 수 없으며 설치할 수 없습니다. 나는 다음과 같은 스크립트를 삽입하지만, bash의 버텍스를 통해 파일의 모든 포맷이 사라진다. 필자는 다른 방법으로 파일을 변조하는 것으로 의심되는데 결과로 변경된 파일을 사용하여 컴파일하려고 할 때 추가적인 오류가 발생합니다.bash를 사용할 때 모든 형식 (공백)을 유지하려면 어떻게해야합니까?

c=0 
while read line 
do 
if [ "$c" -eq 99 ]; then 
    echo -e "// Added by build.sh\n#define PROGMEM\n#define prog_char\n\n$line" 
else 
    echo "$line" 
fi 
((c=c+1)) 
done <libdefs.h>> libdefs.h.new 

업데이트 스크립트 :

이것은 서식을 유지하고 라인을 추가하지만 어떻게 든 파일을 미치게. 만약 내가 수동으로 3 라인을 추가하고 그것을 작동하는 응용 프로그램을 컴파일, 내가 모든 종류의 오류를 얻을 스크립트를 사용합니다.

c=0 
while IFS= read line 
do 
if [ "$c" -eq 99 ]; then 
    echo "// Added by build.sh" 
    echo "#define PROGMEM" 
    echo "#define prog_char" 
    echo "" 
fi 
echo "$line" 
((c=c+1)) 
done <libdefs.h>> libdefs.h.new 

첫 번째는 libdefs.h:363:2: error: expected identifier or '(' before numeric constant입니다. 그래서 빤이 엉망이되고있는 것처럼 보입니다.

DIFF는 :

--- libdefs.h.old 2011-10-01 13:46:34.000000000 -1000 
+++ libdefs.h 2012-03-02 22:00:16.000000000 -1000 
@@ -97,6 +97,10 @@ 
    #include <avr/interrupt.h> 
#endif 

+// Added by build.sh 
+#define PROGMEM 
+#define prog_char 
+ 
// create a type for boolean 
typedef int8_t boolean; 

@@ -351,35 +355,35 @@ 
typedef uint16_t TIMER_MODES; 

// The set of PWM modes 
-#define PWM_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_PWM8_PHASE_CORRECT) | \ 
- BV(TIMER_MODE_PWM9_PHASE_CORRECT) | \ 
- BV(TIMER_MODE_PWM10_PHASE_CORRECT) | \ 
- BV(TIMER_MODE_PWM8_FAST) | \ 
- BV(TIMER_MODE_PWM9_FAST) | \ 
- BV(TIMER_MODE_PWM10_FAST) | \ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | \ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | \ 
- BV(TIMER_MODE_PWM_FAST_ICR) | \ 
- BV(TIMER_MODE_PWM_FAST_OCR) \ 
+#define PWM_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_PWM8_PHASE_CORRECT) | 
+ BV(TIMER_MODE_PWM9_PHASE_CORRECT) | 
+ BV(TIMER_MODE_PWM10_PHASE_CORRECT) | 
+ BV(TIMER_MODE_PWM8_FAST) | 
+ BV(TIMER_MODE_PWM9_FAST) | 
+ BV(TIMER_MODE_PWM10_FAST) | 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | 
+ BV(TIMER_MODE_PWM_FAST_ICR) | 
+ BV(TIMER_MODE_PWM_FAST_OCR) 
)) 

// The set of ICR modes 
-#define ICR_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | \ 
- BV(TIMER_MODE_CTC_ICR) | \ 
- BV(TIMER_MODE_PWM_FAST_ICR) \ 
+#define ICR_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_ICR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR) | 
+ BV(TIMER_MODE_CTC_ICR) | 
+ BV(TIMER_MODE_PWM_FAST_ICR) 
)) 

// The set of OCR modes 
-#define OCR_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_CTC_OCR) | \ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | \ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | \ 
- BV(TIMER_MODE_PWM_FAST_OCR) \ 
+#define OCR_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_CTC_OCR) | 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_OCR) | 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR) | 
+ BV(TIMER_MODE_PWM_FAST_OCR) 
)) 

#define modeIsPWM(mode) (((TIMER_MODES)(BV(mode))) & PWM_MODES) 
@@ -389,29 +393,29 @@ 
#define TIMER_NO_MODES 0 

// Define bits if all modes are supported 
-#define TIMER_ALL_MODES ((TIMER_MODES)(\ 
- BV(TIMER_MODE_NORMAL)|\ 
- BV(TIMER_MODE_PWM8_PHASE_CORRECT)|\ 
- BV(TIMER_MODE_PWM9_PHASE_CORRECT)|\ 
- BV(TIMER_MODE_PWM10_PHASE_CORRECT)|\ 
- BV(TIMER_MODE_CTC_OCR)|\ 
- BV(TIMER_MODE_PWM8_FAST)|\ 
- BV(TIMER_MODE_PWM9_FAST)|\ 
- BV(TIMER_MODE_PWM10_FAST)|\ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_ICR)|\ 
- BV(TIMER_MODE_PWM_PHASE_FREQ_OCR)|\ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR)|\ 
- BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR)|\ 
- BV(TIMER_MODE_CTC_ICR)|\ 
- BV(TIMER_MODE_PWM_FAST_ICR)|\ 
- BV(TIMER_MODE_PWM_FAST_OCR)\ 
+#define TIMER_ALL_MODES ((TIMER_MODES)( 
+ BV(TIMER_MODE_NORMAL)| 
+ BV(TIMER_MODE_PWM8_PHASE_CORRECT)| 
+ BV(TIMER_MODE_PWM9_PHASE_CORRECT)| 
+ BV(TIMER_MODE_PWM10_PHASE_CORRECT)| 
+ BV(TIMER_MODE_CTC_OCR)| 
+ BV(TIMER_MODE_PWM8_FAST)| 
+ BV(TIMER_MODE_PWM9_FAST)| 
+ BV(TIMER_MODE_PWM10_FAST)| 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_ICR)| 
+ BV(TIMER_MODE_PWM_PHASE_FREQ_OCR)| 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_ICR)| 
+ BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR)| 
+ BV(TIMER_MODE_CTC_ICR)| 
+ BV(TIMER_MODE_PWM_FAST_ICR)| 
+ BV(TIMER_MODE_PWM_FAST_OCR) 
)) 

// Define bits for less capable timers 
-#define TIMER_3BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| \ 
+#define TIMER_3BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| 
     BV(TIMER_MODE_PWM8_FAST)|BV(TIMER_MODE_PWM_PHASE_CORRECT_OCR)|BV(TIMER_MODE_PWM_FAST_OCR)) 

-#define TIMER_2BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| \ 
+#define TIMER_2BIT_MODES (BV(TIMER_MODE_NORMAL)| BV(TIMER_MODE_PWM8_PHASE_CORRECT)|BV(TIMER_MODE_CTC_OCR)| 
     BV(TIMER_MODE_PWM8_FAST)) 


@@ -444,11 +448,11 @@ 


#define MAKE_TIMER_COMPARE_DATA() {0,null/*,0*/} 
-#define MAKE_TIMER_COMPARE(data,timer,port,mask,threshold, intport,intmask, comport,combit,pwm) \ 
- {&data,timer, {_SFR_MEM_ADDR(port),BV(mask)},_SFR_MEM_ADDR(threshold), \ 
- {_SFR_MEM_ADDR(intport),BV(intmask)}, \ 
- {_SFR_MEM_ADDR(comport),combit}, \ 
- pwm \ 
+#define MAKE_TIMER_COMPARE(data,timer,port,mask,threshold, intport,intmask, comport,combit,pwm) 
+ {&data,timer, {_SFR_MEM_ADDR(port),BV(mask)},_SFR_MEM_ADDR(threshold), 
+ {_SFR_MEM_ADDR(intport),BV(intmask)}, 
+ {_SFR_MEM_ADDR(comport),combit}, 
+ pwm 
    } 

/** 
@@ -493,27 +497,27 @@ 
} TimerData; 

#define MAKE_TIMER_DATA(prescale) {prescale,/*0,*/null,null,null,null,TIMER_MODE_NORMAL} 
-#define MAKE_TIMER(data, counter,prescaler,sixteenBit,rtc,modes, \ 
- wgm0port, wgm0mask, wgm1port, wgm1mask, wgm2port, wgm2mask, wgm3port, wgm3mask, \ 
- compares,ovrintport,ovrintmask,ovrreqport,ovrreqmask,icr, \ 
- capintport,capintmask,capreqport,capreqmask, capedgeport,capedgemask,\ 
- incapin \ 
- ) \ 
- {&data, _SFR_MEM_ADDR(counter), _SFR_MEM_ADDR(prescaler), sixteenBit, rtc, sizeof(compares)/sizeof(TimerCompare),modes, \ 
-  { \ 
-   {_SFR_MEM_ADDR(wgm0port),BV(wgm0mask)}, \ 
-   {_SFR_MEM_ADDR(wgm1port),BV(wgm1mask)}, \ 
-   {_SFR_MEM_ADDR(wgm2port),BV(wgm2mask)}, \ 
-   {_SFR_MEM_ADDR(wgm3port),BV(wgm3mask)} \ 
-  },\ 
-  compares,\ 
- {_SFR_MEM_ADDR(ovrintport),BV(ovrintmask)},\ 
- {_SFR_MEM_ADDR(ovrreqport),BV(ovrreqmask)}, \ 
- _SFR_MEM_ADDR(icr),\ 
- {_SFR_MEM_ADDR(capintport),BV(capintmask)},\ 
- {_SFR_MEM_ADDR(capreqport),BV(capreqmask)}, \ 
- {_SFR_MEM_ADDR(capedgeport),BV(capedgemask)}, \ 
- incapin \ 
+#define MAKE_TIMER(data, counter,prescaler,sixteenBit,rtc,modes, 
+ wgm0port, wgm0mask, wgm1port, wgm1mask, wgm2port, wgm2mask, wgm3port, wgm3mask, 
+ compares,ovrintport,ovrintmask,ovrreqport,ovrreqmask,icr, 
+ capintport,capintmask,capreqport,capreqmask, capedgeport,capedgemask, 
+ incapin 
+ ) 
+ {&data, _SFR_MEM_ADDR(counter), _SFR_MEM_ADDR(prescaler), sixteenBit, rtc, sizeof(compares)/sizeof(TimerCompare),modes, 
+  { 
+   {_SFR_MEM_ADDR(wgm0port),BV(wgm0mask)}, 
+   {_SFR_MEM_ADDR(wgm1port),BV(wgm1mask)}, 
+   {_SFR_MEM_ADDR(wgm2port),BV(wgm2mask)}, 
+   {_SFR_MEM_ADDR(wgm3port),BV(wgm3mask)} 
+  }, 
+  compares, 
+ {_SFR_MEM_ADDR(ovrintport),BV(ovrintmask)}, 
+ {_SFR_MEM_ADDR(ovrreqport),BV(ovrreqmask)}, 
+ _SFR_MEM_ADDR(icr), 
+ {_SFR_MEM_ADDR(capintport),BV(capintmask)}, 
+ {_SFR_MEM_ADDR(capreqport),BV(capreqmask)}, 
+ {_SFR_MEM_ADDR(capedgeport),BV(capedgemask)}, 
+ incapin 
    } 

// Define the signature of code that is the destination of an rprintf output 
+0

포스트 전후 사이의 통합은 diff. –

+0

@ IgnacioVazquez-Abrams - 게시했습니다. – Justin808

답변

4

당신은하지 분할 단어 (또는 오히려, 단어를 분할하는 것이없는 만들)에 read 말할 필요가있다.

while IFS= read line 

또한, $lineecho -e 나쁜 일을 할 것입니다. 항상 $line을 인쇄하고 다른 것들을 조건부로 인쇄하십시오.

편집 :

아하. 백 슬래시가 종료되지 않도록하려면 read -r을 사용해야합니다.

+0

흠 ... 이것은 공백을 남겨 뒀지 만 여전히 어떻게 든 파일을 손상시킵니다. 나는 업데이트 된 스크립트를 게시 할 것이다. – Justin808

+0

그 트릭을 했어! 엄청 고마워 – Justin808

0

이 당신을 위해 작동 될 수 있습니다

OIFS=$IFS; IFS=$'\n'; a=($(<libdefs.h)); IFS=$OIFS 
a[98]=$'// Added by build.sh\n#define PROGMEM\n#define prog_char\n'${a[98]} 
printf "%s\n" "${a[@]}" >libdefs.h.new 

나이 :

{ head -n98 libdefs.h; 
printf "// Added by build.sh\n#define PROGMEM\n#define prog_char\n" 
tail -n+99 libdefs.h; } >libdefs.h.new 
관련 문제