我需要通过bash脚本在文件中添加3行; sed
和awk
未安装且无法安装。我有以下脚本插入行,但通过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
答案 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