使用bash时如何保留所有格式(空格)?

时间:2012-03-03 06:58:32

标签: bash

我需要通过bash脚本在文件中添加3行; sedawk未安装且无法安装。我有以下脚本插入行,但通过bash的vertue文件中的所有格式都将丢失。我怀疑它以其他方式破坏了文件以及当我尝试使用生成的,修改过的文件进行编译时出现其他错误。

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。所以看起来parens正在混乱。

差异:

--- 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

2 个答案:

答案 0 :(得分:4)

您需要告诉read不要拆分单词(或者更确切地说,让它无法拆分单词)。

while IFS= read line

另外,echo -e上的$line会做坏事。始终打印$line,并有条件地打印其他内容。

修改

啊哈。您还需要使用read -r来阻止它杀死反斜杠。

答案 1 :(得分: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