截取文件名和后缀

编写Shell脚本的过程中,经常会和文件名和文件路径打交道。如果用户输入了一个文件的全名(可能包含绝对路径和文件后缀),如何得到文件的路径名,文件名,文件后缀这些信息呢。Shell脚本拥有强大的字符串处理能力,如果把文件名当做字符串,我们不难使用cut或sed这样的工具得到我们想要的结果。

1
2
3
4
5
6
7
$fullfile=/the/path/foo.txt
$fullname=$(basename $fullfile)
$dir=$(dirname $fullfile)
$filename=$(echo $fullname | cut -d . -f1)
$extension=$(echo $fullname | cut -d . -f2)
$ echo $dir , $fullname , $filename , $extension
/the/path , foo.txt , foo , txt

这里使用basename命令可以直接得到包含后缀的文件名,而dirname命令可以得到路径名,然后就能简单的用cut截取文件名和后缀名。

阅读全文 »

万万没想到,有一天也会沦落到在一台4G内存的Win7笔记本上搞linux编程,还我的16核Z600……好吧,抱怨也是没有用的,和销售人员一样型号的13寸笔记本,标志着我的coding生涯从此全面进入虚拟机和SSH时代。

先不说外接键盘、鼠标、显示器的酸爽,作为开发编译环境的虚拟机就是个问题。放在某个server上,锁在大楼的某处,感觉蛮牢。直到一次急等着release一个feature时怎么也连不上,跑去一看,那台server已经被人大卸八块了……幸好最后装上还能用,着实惊出一身冷汗。这件事提醒我真的需要好好考虑怎么将开发环境管理好,减少重新配置环境的开销和风险,甚至为整个团队构建更高效的开发和测试环境,提高团队效率……

解放生产力的共产主义理想先不说,说起虚拟机的设置、部署和迁移,vagrant是鼎鼎大名了。按照官网的描述,vagrant是用于创建和配置轻量级、可复用、跨平台的开发环境的工具。

阅读全文 »

Sed - 1: 基本概念
Sed - 2: 常用功能
Sed - 3: 高级功能

Sed常用命令列表如下:

  命令   功能
a| 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c| 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用”"续行
i| 在当前行之前插入文本。多行时除最后一行外,每行末尾需用”"续行
d 删除行
h 把模式空间里的内容复制到暂存缓冲区
H 把模式空间里的内容追加到暂存缓冲区
g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q 结束或退出sed
r 从文件中读取输入行
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个
g 在行内进行全局替换
w 将所选的行写入文件
x 交换暂存缓冲区与模式空间的内容
y 将字符替换为另一字符(不能对正则表达式使用y命令)
阅读全文 »

GNU sed独有的替换字符串标记

  • \l : sed将\l标记之后的单个字符输出为小写
  • \L : sed将\L标记之后所有的字符串作输出为小写
  • \u : 对应\l标记,sed将\u之后的单个字符输出为大写
  • \U : 对应\L标记,sed将\U标记之后所有的字符串作输出为大写

这些字符串标记一般配合正则表达式分组使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cat employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

# 将第1和第2分组交换位置,将第2分组内容改为大写,第3分组内容改为小写
$ sed 's/\([^,]*\),\([^,]*\),\(.*\).*/\U\2\E,\1,\L\3/g' employee.txt
JOHN DOE,101,ceo
JASON SMITH,102,it manager
RAJ REDDY,103,sysadmin
ANAND RAM,104,developer
JANE MILLER,105,sales manage
阅读全文 »

我们最近做的项目是和多方合作,系统依赖的很多程序和设置都来自第三方,系统的运行环境全都做在了一块硬盘里。从我们拿到这块硬盘起系统的运行就没有正常过。经过多日的调试,可以判断出是依赖的一些库和配置文件有错误,导致软件运行异常。多次协调对方也不愿意提供更多关于修复安装和配置的信息(当然可能他们也不知道)。项目开始时没有人留意,出了事故才发现,整个项目的开发过程中,能运行系统的环境竟然在唯一的一块硬盘上。简直是这辈子最苦逼的开发体验,所有人都很重视,所有领导都每天询问,各种高级工程师秒回你的邮件。但是…但是所有的细节都是秘密,所有问实现,问原理,求指导的问题都不正面回答,要求一个纯净的可用的硬盘也没人答复,所有人都等着你探索黑盒子里的秘密……

当然我是幸运的,最后通过其他途径找到一台还能运行的旧版设备,使用硬盘对拷的办法,在一块新的硬盘上克隆了全部运行环境,基于这个环境才搭起了系统。

阅读全文 »

因为经常要在windows、Linux和mac下切换工作环境,而Vim在不同平台下很难保持一致的使用体验,设置很困难,最近使用sublime的场景越来越多。Sublime有相对方便的package安装管理方法,结合Git的版本管理,可以很简单的在不同平台下同步设置。

package文件夹位置

Sublime Text 3 中默认的package文件夹位置如下:

1
2
3
OS X: ~/Library/Application Support/Sublime Text 3/Packages/
Windows: %APPDATA%/Roaming/Sublime Text 3/Packages/
Linux: ~/.config/sublime-text-3/Packages/

可以通过点击工具栏Preferences|Browse Packages选项找到文件夹位置。这里面我们感兴趣的是User文件夹。

阅读全文 »

文本替换

1
[address]s/pattern/replacement/flags

4种常用替换标记:

  • n数字 : 表明仅替换前n个被pattern匹配的内容
  • g : 表明替换所有匹配的地方。如果flags为空,则默认替换第一次匹配。
  • p : 仅当行被pattern匹配时,打印模式空间的内容
  • w file : 将替换的结果写入到文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat data
This is a test of the test script.
This is the second test of the test script.
$
$ sed 's/test/trail/' data #默认替换每一行的第1次匹配
This is a trail of the test script.
This is the second trail of the test script.
$
$ sed 's/test/trial/2' data #只替换每一行的第2次匹配
This is a test of the trial script.
This is the second test of the trial script.
$
$ sed 's/test/trial/g' data #替换所有的匹配
This is a trial of the trial script.
This is the second trial of the trial script.
阅读全文 »

Snippet(片段)在编程中是指一段可复用的代码或文本,在绝大部分编辑器和IDE中都有Code Snippet功能。Code Snippet代码片段自动生成据说是textMate首创的,现在主流的编辑器和IDE都有类似的功能,可以让用户针对不同的场景定制、管理和插入代码片段。在Vim中自从我用了ultisnips,傍观者的智商再也跟不上我码代码的速度,谈笑风生,弹指间满屏代码,可谓居家旅行必备装X神奇。

阅读全文 »

Sed编辑器

Sed编辑器被称作“流编辑器”,不同于一般的交互式文本编辑器(比如Vim、nano)需要用户交互式的输入来编辑文本内容,Sed会基于预先提供的一组规则来编辑数据流。在Shell脚本中,解析LOG文件或修改配置文件等处理文本文件的任务非常普遍。而Sed这样的命令行编辑器正好满足在Shell脚本中完成自动处理文本的需求。

调用选项

1
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
选项 描述
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出, 等待print命令输出
-i 表示将转换结果直接插入文件中
-f 按照指定的sed脚本里面的命令来进行转换
阅读全文 »

文件存储格式

不同于html或xml等协议把信息保存为文本格式,protobuf把数据保存为二进制,DICOM协议的数据既有文本格式又有二进制格式。用文本编辑器打开一个dcm文件,数字字母这些我们认识的就是文本数据,叉叉圈圈框框……这些就是二进制数据。由于二进制数据在不同的计算机系统上的字节序不同(可以参考big-endian和little-endian相关知识 ),当DICOM数据在不同的系统间传输时,就要采用统一的标准,在后来DICOM传输部分会有进一步说明。

阅读全文 »