• shell脚本获取文件中的版权(Copyright)


    shell脚本代码如下:

    1. #!/bin/bash
    2. # get file copyright
    3. if [ -f "$1" ]; then
    4. file_copyright=`head -100 "$1" | grep -i "Copyright (C)"`
    5. if [ -n "$file_copyright" ]
    6. then
    7. file_copyright=${file_copyright#*([Cc]) }
    8. echo "111 file copyright: $file_copyright"
    9. file_copyright=`echo "$file_copyright" | sed 's/\W*$//'`
    10. echo "222 file copyright: $file_copyright"
    11. file_copyright="Copyright "$file_copyright
    12. else
    13. file_copyright="NONE"
    14. fi
    15. echo "file copyright: $file_copyright"
    16. else
    17. echo "$1 is not a file"
    18. fi

    代码看似简单,实际上其中蕴藏着几个知识点:

    知识点1  shell中#*,##*,#*,##*,% *,%% *的含义及用法

    对应代码:file_copyright=${file_copyright#*([Cc]) }

    假设定义了一个变量为:
    代码如下: file=/dir1/dir2/dir3/my.file.txt


    可以用${ }分别替换得到不同的值:
    ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
    ${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
    ${file##*.}:删掉最后一个 . 及其左边的字符串:txt
    ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
    ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
    ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my


    记忆的方法为
    # 是 去掉左边(键盘上#在 $ 的左边)
    %是去掉右边(键盘上% 在$ 的右边)
    单一符号是最小匹配;两个符号是最大匹配

    代码的意思是先取文件的前100行,在其中搜索包含“Copyright (C)”关键字的行,

    实际文件中的内容实例如下(截取):

    1. GNU LIBRARY GENERAL PUBLIC LICENSE
    2. Version 2, June 1991
    3. Copyright (C) 1991 Free Software Foundation, Inc.
    4. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
    5. Everyone is permitted to copy and distribute verbatim copies
    6. of this license document, but changing it is not allowed.

    也就是说运行file_copyright=`head -100 "$1" | grep -i "Copyright (C)"`会得到如下结果:

     Copyright (C) 1991 Free Software Foundation, Inc.

    之后再执行file_copyright=${file_copyright#*([Cc]) },意思是删掉第一个[C]或[c]及其左边的字符串,会得到如下结果:

    1991 Free Software Foundation, Inc.

    对于大多数文件,这样就可以了。但实际中有些文件比较“各色”,比如以下内容:

    1. ----------------------------------------------------------------
    2. -- ZLib for Ada thick binding. --
    3. -- --
    4. -- Copyright (C) 2002-2003 Dmitriy Anisimkov --
    5. -- --
    6. -- Open source license information is in the zlib.ads file. --
    7. ----------------------------------------------------------------

    对于这样的格式,如果只运行到以上步骤,会得到如下结果:

    2002-2003 Dmitriy Anisimkov                 --

     可以看到后边多了无用的空格以及'-'。如何去掉这些无用字符?这就是第二个知识点。

    知识点2  shell中通过sed删除非单词字符

    对应代码:file_copyright=`echo "$file_copyright" | sed 's/\W*$//'`

    要先弄清楚这句代码的意思,先来看一下类似的代码:

    删除行尾空白

    sed -i ‘s/\s*$//’

    格式为:sed ‘s/要被取代的字串/新的字串/g’
    s:替换
    \s:空格
    *:0-n匹配字符
    $:行尾

    我们这里不是对文件,因此去掉-i参数,另外将\s换为\W,关于\s以及\W的具体意义如下:

    \s 任何空白字符
    \S 任何非空白字符
    \d 任何数字
    \D 任何非数字
    \w 任何单词字符(字母、数字、下划线)
    \W 任何非单词字符

    这句代码实际完成的工作是:去掉到行结尾处的非单词字符。执行此语句后,结果如下:

    2002-2003 Dmitriy Anisimkov

    可见,空格和'-'都被去掉了。

    到这里还不算完成,还要确保对于一般情况也适用,不会有影响。

     Copyright (C) 1991 Free Software Foundation, Inc.

     对于这种情况,最终会得到:

    1991 Free Software Foundation, Inc

     可见虽然比之前的结果少了一个结尾处的'.',但影响不大,可以接受。

    这样脚本就可以正常工作,获取文件中的版权了。

  • 相关阅读:
    wpf menu 菜单 快捷键
    easyrecovery数据恢复软件免费版下载
    求最大公约数
    哪款电容笔在ipad上好用?便宜好用的电容笔推荐
    JAVA集合04_Map接口概述、常用方法、排序、Hashtable面试题
    【大数据之Kafka】十五、Kafka-Kraft模式
    PCA9535模块移植
    YOLOv5实现车辆检测(含车辆检测数据集+训练代码)
    Vue_02 快速入门 基础语法02
    MySQL8 分页数据重复或丢失问题说明(order by limit)
  • 原文地址:https://blog.csdn.net/phmatthaus/article/details/127124358