РЕДАКТИРОВАТЬ : Ой, мой ответ в основном дублирует ответ Чороба. Я собираюсь оставить это здесь, потому что я думаю, что в нем будет немного больше подробностей о причинах, но вы, вероятно, должны принять Чоробу.
Ваша проблема здесь:
for LINE in `(cat temp1)`
Это разбивает каждую строку, используя IFS
, так что при заданной строке ввода вот так:
extern void alpha_display
Вы получаете цикл for, который выглядит примерно так:
for LINE in extern void alpha_display; do
Это означает, что LINE
установлен в последовательности:
- extern
- void
- alpha_display
Чтобы продемонстрировать это, попробуйте следующий маленький скрипт:
for LINE in `cat temp1`; do
echo "$LINE"
done
Если вы действительно хотите читать файл построчно, лучше использовать read
в цикле while
с вводом, перенаправленным из вашего файла souce. Сравните вывод следующего с тем, что производит предыдущий скрипт:
while read LINE; do
echo "$LINE"
done < temp1
Имея это в виду, вы можете исправить свой скрипт следующим образом:
while read LINE; do
if [[ "$LINE" = sendMessage4K* ]]; then
echo '/*---RUAISI---*/' >> temp2
elif [[ "$LINE" = *alpha_display\(* ]]; then
echo '/*---RUAISI---*/' >> temp2
fi
echo "$LINE" >> temp2
done < temp1
Обратите внимание, что в дополнение к использованию цикла while
я также удалил оператор регулярного выражения из выражения elif
(поскольку, как уже указывалось, вы использовали глобальные выражения, а не регулярные выражения) и я удалил некоторый избыточный код.
Этот скрипт выдает следующий вывод:
FIX
/*---RUAISI---*/
sendMessage4K(NomRPC,sbuffer,"KP07");
FIX
extern void alpha_display(char *loc, long length){
/*---RUAISI---*/
FIX
}
FIX
Поскольку read
на самом деле все еще разделяет вещи в IFS (а затем соединяет их вместе), вы теряете пробелы в начале или в конце. Это можно исправить, добавив в IFS только конец строки, добавив в начало сценария следующее:
IFS='\n'
Я бы все же предположил, что bash
не обязательно является подходящим инструментом для этой работы. sed
или awk
, вероятно, будет более эффективным. Вот то же самое, что и скрипт awk:
#!/usr/bin/awk
/sendMessage4K/ || /alpha_display\(/ {
print "/*---RUAISI---*/"
print
next
}
{print}
Если вы сохранили это в файле с именем "fixit.awk", вы бы запустили его так:
awk -f fixit.awk < temp1 > temp2