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

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

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

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


版权声明:本文为phmatthaus原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。