shell脚本代码如下:
- #!/bin/bash
-
- # get file copyright
- if [ -f "$1" ]; then
- file_copyright=`head -100 "$1" | grep -i "Copyright (C)"`
- if [ -n "$file_copyright" ]
- then
- file_copyright=${file_copyright#*([Cc]) }
- echo "111 file copyright: $file_copyright"
- file_copyright=`echo "$file_copyright" | sed 's/\W*$//'`
-
- echo "222 file copyright: $file_copyright"
- file_copyright="Copyright "$file_copyright
- else
- file_copyright="NONE"
- fi
- echo "file copyright: $file_copyright"
- else
- echo "$1 is not a file"
- 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)”关键字的行,
实际文件中的内容实例如下(截取):
- GNU LIBRARY GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- Everyone is permitted to copy and distribute verbatim copies
- 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.
对于大多数文件,这样就可以了。但实际中有些文件比较“各色”,比如以下内容:
- ----------------------------------------------------------------
- -- ZLib for Ada thick binding. --
- -- --
- -- Copyright (C) 2002-2003 Dmitriy Anisimkov --
- -- --
- -- Open source license information is in the zlib.ads file. --
- ----------------------------------------------------------------
对于这样的格式,如果只运行到以上步骤,会得到如下结果:
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
可见虽然比之前的结果少了一个结尾处的'.',但影响不大,可以接受。
这样脚本就可以正常工作,获取文件中的版权了。