Shell 脚本添加或替换文本块?

Shell 脚本添加或替换文本块?

.c我正在寻找一个 shell 脚本(Bash),它可以在文件(for和.hfiles)的开头添加或替换版权文本。

它应该搜索并添加或替换我执行脚本的父目录中的所有.c和文件的版权文本块。.h

现有版权文本:

            /* --------------------------------------------------
                Copyright 2014 Author name

                All rights reserved
             ----------------------------------------------------*/

新的版权文本。

             /* Copy right text bla bla bla
              * some license text bla bla bla
              * All rights reserved xyz xyz */

笔记

  1. 版权文本应仅添加在文件的开头 (.c.h),并且现有的版权文本始终位于文件的开头。

  2. 它应该搜索并添加或替换父目录和子目录中的所有.c和文件。.h

编辑

这是我尝试过的:

      for file in `find . -type f -name "*.h"`
       do
       echo $file
       if grep -qRin "                            ----------------------------------------------------------------------\*\/" $file
        then
       echo "Replaced License Text"
         sed '1,/^ ----------------------------------------------------------------------\*\/$/d' < $file | cat licence_file - > $file.new
       mv $file.new $file
      else
    cat licence_file $file >$file.new && mv $file.new $file
     echo "Added License Test"
     fi
      done

License_file 包含我的新许可证文本。

答案1

ed是“标准文本编辑器”。对于日常编辑来说它并不是很理想,但它是易于编写脚本

ed file.c <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

第一个命令从第一行开始删除,直到包含 a 的第一行*/(the*和 the都/需要转义)。第二个命令是一个简单的插入 - 告诉i进入ed“插入”模式,而 a.本身告诉ed退出插入模式。w表示“写入”,并保存文件;q意思是“退出”。整个事情都在一个“here-document”中,它以一个开头和结尾EOF(这是任意的;您可以使用任何您想要的字符串)。

这可以很容易地在循环中使用:

for f in ./*.{c,h}; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

如果您想要递归性(即在子目录中工作),请在上面的命令中使用shopt -s globstar和使用,或者使用while 循环:./**/*.{c,h}find

find . -name '*.c' -name '*.h' -print0 | while read -d '' f; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

如果您可能多次执行此操作,则可能值得将其放入脚本中。

#!/bin/sh
ed "$1" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

如果您将其命名为copyright.sh,将其放入$PATH 中的某个位置,并使其可执行,那么您可以简单地:

shopt -s globstar
for f in ./**/*.{c,h}; do copyright.sh "$f"; done

答案2

有点乱,但是这个 python 可以工作:

#!/usr/bin/python
import sys
filename = sys.argv[1]
fo=open(filename,'r+')
fr=fo.read()
frs=fr.replace('/* --------------------------------------------------\n                Copyright 2014 Author name\n\n                All rights reserved\n             ----------------------------------------------------*/','/* Copy right text bla bla bla\n* some license text bla bla bla\n* All rights reserved xyz xyz */')
fo.seek(0,0)
fo.write(frs)
fo.close()

如果原始文本和替换文本是,则此方法有效确切地采用与问题中给出的相同格式(包括连字符线)。使用以下命令从文件所在的目录调用此 python:

for i in ./{*.c,*.h} ; do python <scriptname.py> $i ; done

怎么运行的:

直截了当。它只是打开文件,并将该行中第一对单引号之间给出的行替换frs=fr.replace....为同一行中第二对单引号中给出的行。

相关内容