shell脚本代码如下:

#!/bin/bash# get file copyright
if [ -f "$1" ]; thenfile_copyright=`head -100 "$1" | grep -i "Copyright (C)"`if [ -n "$file_copyright" ]thenfile_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_copyrightelsefile_copyright="NONE"fiecho "file copyright: $file_copyright"
elseecho "$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 LICENSEVersion 2, June 1991Copyright (C) 1991 Free Software Foundation, Inc.51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USAEveryone is permitted to copy and distribute verbatim copiesof 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

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

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

shell脚本获取文件中的版权(Copyright)相关推荐

  1. Linux中使用shell脚本向文件中写数据

    以前没写过shell脚本,懂得一些Linux的操作命令.看了网上一些shell脚本的方法.总结,发现用脚本将一些数据写入文件比较实用.遂举例如下: #!/bin/bash #Test echo &qu ...

  2. shell脚本替换文件中字符

    1.将当前目录下包含jack串的文件中,jack字符串替换为tom sed -i "s/jack/tom/g" `grep "jack" -rl ./` 2.将 ...

  3. Linux中 shell 脚本获取当前工作目录的方法

    Linux中 shell 脚本获取当前工作目录的方法 1. 示例 2. 注意: 参考: 1. 示例 test.sh target_dir=$(cd $(dirname $0); pwd) echo $ ...

  4. 在linux中编写shell脚本文件,如何编写简单的Shell脚本(Script)文件之Linux的基本操作...

    如何编写简单的Shell脚本(Script)文件之Linux的基本操作 新建一个文本文件包含所需要的脚本.举例,我会使用pico编辑器写一个脚本用来运行程序tar,带上必要的可选项可以用来解压从因特网 ...

  5. shell脚本读取文件夹内文件名称

    shell脚本读取文件夹内文件名称代码如下: 1.配置文件: readFilePath=/wocloud/soft/tomcat/selfYearAppraiseTomcat/selfYearAppr ...

  6. shell脚本获取mysql插入数据自增长id的值

    shell脚本获取mysql插入数据自增长id的值 在shell脚本中我们可以通过last_insert_id()获取id值,但是,需要注意的是,该函数必须在执行插入操作的sql语句之后,立即调用,否 ...

  7. shell脚本获取cpu、内存、磁盘使用率

    1.获取cpu使用率脚本 #!/bin/sh # #脚本功能描述:依据/proc/stat文件获取并计算CPU使用率 # #CPU时间计算公式:CPU_TIME=user+system+nice+id ...

  8. iOS中更新版权 Copyright

    iOS中更新版权 // Copyright ©️ 背景 由于公司组织架构调整,增量code可能会有新的版权©️调整,因此需要更新Copyright 方法 修改 Created by xxx 系统偏好设 ...

  9. python3文件下载-python3获取文件中url内容并下载代码实例

    这篇文章主要介绍了python3获取文件中url内容并下载代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 #!/usr/bin/env py ...

最新文章

  1. 一文读懂Python复杂网络分析库networkx | CSDN博文精选
  2. 腾讯发布最新开源jdk!
  3. MQTT基础——Part 1. 认识MQTT
  4. Source Insight 格式化
  5. 面试题目--MPEG4与H.264的区别
  6. 服务器账户登录监控系统,服务器账户登录监控系统
  7. java synchronized关键字_Java synchronized 关键字,你用的对吗?
  8. Qt工作笔记-Qt文档笔记-QPainter::drawText写文本并且居中
  9. b站测试岗怎么样_情商测试《大家一起察言观色》,一款适合作为B站测试题的游戏...
  10. jquery 所有contenteditable=true的元素_JavaScript学习笔记(三十一) jQuery(上)
  11. 无线AP与无线路由器都有些什么区别?(一)
  12. 算法导论的道与术、工程师思维奠定能走多远
  13. 数学模型 商人过河问题 C++实现
  14. REST, Hypermedia HATEOAS - Django REST framework
  15. php ios表情包,[iOS] 自定义表情包
  16. 我的简约论坛php源码,我的论坛源代码(二)
  17. SAP那些事-理论篇-3-SAP到底是个什么东东
  18. 用python解矩阵方程_用Python的Numpy求解线性方程组
  19. BSGS(拔山盖世算法),北上广深算法
  20. Android DirectBoot模式

热门文章

  1. 线性代数·关于线性相关和线性组合
  2. 基于ARM开发板的智能家居控制系统设计
  3. g++来进行编译的头文件路径问题
  4. 如何用 MacBook 提高工作效率 【配置篇】
  5. Dropbox 架设免费个人网站
  6. 有苦有乐的算法 --- 使用队列结构实现栈结构
  7. 1到10之间所有数的平方和立方
  8. 基础面试题:java内存区域
  9. os.path.isdir()函数的作用和用法-判断是否为目录
  10. 记一次网易七鱼云客服开发记录