首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用一个涉及回显的shell脚本向C++文件中添加学生头:用实际的换行符替换\n,有办法改变行为吗?

使用一个涉及回显的shell脚本向C++文件中添加学生头:用实际的换行符替换\n,有办法改变行为吗?
EN

Stack Overflow用户
提问于 2017-03-31 10:41:43
回答 1查看 149关注 0票数 0

我正在上一门C++课程,要求每个提交的文件顶部都有一个学生标题。键入它或yank/粘贴是如此乏味,我一直在编写一个脚本来为我添加它。到目前为止,我已经有了一些对我有用的东西,但我刚刚注意到,它所操作的文件中任何字符串中的每个\n都被替换为一个实际的换行符。我猜想这要么是脚本中使用catecho的结果,要么是我试图找出如何避免这种情况的方法。

echo的命令说默认行为是忽略反斜杠转义,但我不完全确定这与我想要做的事情有什么关系。

我的剧本是:

代码语言:javascript
复制
#!/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

如果有另一种完全实现这一目标的方法,请随意提出建议。我更感兴趣的是在这里学习,剧本只是为了好玩/教育,所以它并不是非常重要。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 10:54:25

问题是将-e参数交给echo(1)命令,这使得它将\n解释为一条新行。删除那个-e,它就能工作了。我的意思是,当您编写自己的头时,您需要那个-e,但是您应该将$(cat $f)移出"echo -e“之外。例如,在两行:

代码语言:javascript
复制
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“文件之前擦除(空)它。你可以做的是:

代码语言:javascript
复制
newcontent=$(tail -n +6 $f)
echo "$newcontent" > $f

因此,要添加您的头,使用两个不同的回波,但是在写入文件之前先读取它:

代码语言:javascript
复制
newcontent="$(cat $f)"
echo -e "// $NAME\n// $CLASS\n// $ASSIGNMENT\n// $DATE\n\n" > $f
echo "$newcontent" >> $f    # notice the double angle >>

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43138687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档