Использование сценария оболочки с использованием 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 >>

Я надеюсь, что это помогает.

Другие вопросы по тегам