我正在上一门C++课程,要求每个提交的文件顶部都有一个学生标题。键入它或yank/粘贴是如此乏味,我一直在编写一个脚本来为我添加它。到目前为止,我已经有了一些对我有用的东西,但我刚刚注意到,它所操作的文件中任何字符串中的每个\n都被替换为一个实际的换行符。我猜想这要么是脚本中使用cat或echo的结果,要么是我试图找出如何避免这种情况的方法。
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如果有另一种完全实现这一目标的方法,请随意提出建议。我更感兴趣的是在这里学习,剧本只是为了好玩/教育,所以它并不是非常重要。
谢谢!
发布于 2017-03-31 10:54:25
问题是将-e参数交给echo(1)命令,这使得它将\n解释为一条新行。删除那个-e,它就能工作了。我的意思是,当您编写自己的头时,您需要那个-e,但是您应该将$(cat $f)移出"echo -e“之外。例如,在两行:
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 >>希望能帮上忙。
https://stackoverflow.com/questions/43138687
复制相似问题