Использование сценария оболочки с использованием echo для добавления студенческого заголовка в файлы C++: \n заменяет реальный символ новой строки, есть ли способ изменить поведение?
Я беру курс C++, который требует заголовок студента в верхней части каждого представленного файла. Набирать его или вставлять / вставлять очень утомительно, я работаю над сценарием, чтобы просто добавить его для меня. У меня есть кое-что, что работает для меня до сих пор, но я просто заметил, что каждый \n
в любой строке в файлах, с которыми он работает, они заменяются фактической новой строкой. Я предполагаю, что это либо результат использования cat
или же echo
в сценарии, и я пытаюсь выяснить, как этого избежать.
Manpage для echo
говорит, что по умолчанию поведение игнорирует обратную косую черту, но я не совсем уверен, как это связано с тем, что я пытаюсь сделать.
Мой сценарий:
#!/bin/bash
NAME="Joseph Morgan"
CLASS="CISP 400 MoWe 3:00pm"
ASSIGNMENT=$1
DATE=$(date -I)
if [[ $# -eq 0 ]] ; then
echo 'Argument required:'
echo 'Usage: SOME_PROJECT_NAME [Adds project name to header] | d [Deletes header]'
exit 0
fi
if [ $1 == "d" ] ; then
echo 'Deleting header - Be careful! If no header is present, the first five lines of your files will be deleted'
read -p "Are you sure? (y/n)" -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
for f in ./*.cpp ;
do
echo "$(tail -n +6 $f)" > $f
done
for f in ./*.h ;
do
echo "$(tail -n +6 $f)" > $f
done
fi
exit 0
fi
for f in ./*.cpp ;
do
echo -e "// $NAME\n// $CLASS\n// $ASSIGNMENT\n// $DATE\n\n$(cat $f)" > $f
done
for f in ./*.h ;
do
echo -e "// $NAME\n// $CLASS\n// $ASSIGNMENT\n// $DATE\n\n$(cat $f)" > $f
done
Если есть другой способ полностью выполнить это, не стесняйтесь предлагать это. Я гораздо больше заинтересован в обучении здесь, сценарий был просто для развлечения / образования, так что это не невероятно важно.
Спасибо!
1 ответ
Проблема с -e
параметр, передаваемый команде echo(1), который интерпретирует ее \n
как новая строка. Удалить это -e
и это будет работать. Я имею в виду, вам нужно это -e, когда вы пишете свои собственные заголовки, но вы должны переместить $(cat $f)
вне "эхо-э". Например, в две строки:
echo -e "// $NAME\n// $CLASS\n// $ASSIGNMENT\n// $DATE\n\n" > $f
echo "$(cat $f)" >> $f # notice the double angle >>
НО ОСТЕРЕГАЙТЕСЬ, что бы удалить ваш файл перед прочтением. Даже здесь есть проблема:
echo "$ (tail -n +6 $ f)"> $ f
потому что он может стереть (очистить) файл "$f" перед его чтением. Вы могли бы сделать вместо этого:
newcontent=$(tail -n +6 $f)
echo "$newcontent" > $f
Итак, чтобы добавить свои заголовки, используйте два разных эха, но прочитайте файл, прежде чем писать в нем:
newcontent="$(cat $f)"
echo -e "// $NAME\n// $CLASS\n// $ASSIGNMENT\n// $DATE\n\n" > $f
echo "$newcontent" >> $f # notice the double angle >>
Я надеюсь, что это помогает.