sed学习笔记

转自http://blog.zhangjianfeng.com/article/532

 

sed 编辑指令的格式如下 :
[address1[,address2]]function[argument]
#address1/2可为行数或regular expression, 函数参数 function[argument] 为 sed 的内定函数
#/apple/,/orange/d 表示删除含有 “apple” 至 “orange” 字符串的数据行

++函数参数 功能列表
: label  建立 script file 内指令互相参考的位置。
#  建立批注
{ }  集合有相同位址参数的指令。
!  不执行函数参数。
=  印出资料行数( line number )。
a/  添加使用者输入的数据。
b label  将执行的指令跳至由 : 建立的参考位置。
c/  以使用者输入的数据取代数据。
d  删除数据。
D  删除 pattern space 内第一个 newline 字母 / 前的数据。
g  拷贝数据从 hold space。
G  添加资料从 hold space 至 pattern space 。
h  拷贝数据从 pattern space 至 hold space 。
H  添加资料从 pattern space 至 hold space 。
l  印出 l 资料中的 nonprinting character 用 ASCII 码。
i/  插入添加使用者输入的数据行。
n  读入下一笔资料。
N  添加下一笔资料到 pattern space。
p  印出资料。
P  印出 pattern space 内第一个 newline 字母 / 前的数据。
q  跳出 sed 编辑。
r  读入它檔内容。
s  替换字符串。
t label  先执行一替换的编辑指令 , 如果替换成牛p>则将编辑指令跳至 : label 处执行。
w  写资料到它文件内。
x  交换 hold space 与 pattern space 内容。
y  转换(transform)字符。

++ 函数参数 s 表示替换(substitute)文件内字符串。其指令格式如下 :
[address1[ ,address2]] s/pattern/replacemen/[flag]
#flag : 主要用它来控制一些替换情况 :
当 flag 为 g 时 , 代表替换所有符合(match)的字符串 。
当 flag 为十进制数 m 时 , 代表替换行内第 m 个符合的字符串。
当 flag 为 p 时 , 代表替换第一个符合 pattern 的字符串后 , 将数据输出标准输出文件。
当 flag 为 w wfile 时 , 代表替换第一个符合 pattern 的字符串后 , 输出到 wfile 檔内(如果 wfile 不存在 , 则会重新开启名为 wfile 的档案)。
#数据文件的 “test” 被替换成 “test my car”
sed -e ’s/test/& my car/’ filename  ## &:代表其前 pattern 字符串
#数据文件的 “test my car” 被替换成 “[my car test]”
sed -e  ’s//(test/) /(my/) /(car/)/[/2 /3 /1]/’ filename #/n代表pattern中被第 n 个 /(XX/)所括起来的字符串

++参数 p 可以显示符合条件行
sed -n ‘1p;5p’ filename #显示filename的第1行和第5行
sed -n ‘1p,5p’ filename #显示filename的第1行到第5行
sed -n ‘/中国人/p’ filename #显示filename中所有含有”中国人”字段的行

++函数参数 d 表示删除数据行 , 其指令格式如下:
[address1[ ,address2]] d

++函数参数 a 表示将资料添加到文件中。其指令格式如下:
[address1] a/  使用者所输入的数据
sed -e ‘/美国人/a/中国人’ filename #添加 “中国人” 在含 “美国人” 字符串的数据行后
#如果需要插入多行,可以加/n

++函数参数 i 表示将资料插入文件中。其指令格式如下:
[address1] i/  使用者所输入的数据
sed -e ‘/美国人/i/中国人’ filename #添加 “中国人” 在含 “美国人” 字符串的数据行前

++函数参数 c 表示将以使用者输入的数据取代数据。其指令格式如下:
[address1] c/  使用者所输入的数据
sed -e ‘/美国人/c/中国人’ filename #将 “中国人” 所在行数据更换为 “美国人” 字符串

++&可以在行内替换指定关键字
sed -e ’s/美国人/中国人/’ filename #将 “中国人” 所在行中,”中国人”更换为 “美国人”

++函数参数 r 表示读入它档案内容到檔中。其指令格式如下 :
[address1] r 它檔名称
sed ’/美国人/r otherfile/’ filename #将otherfile文件内容附加到所有含”美国人”行的下面

++函数参数 w 表示将檔中的写到它檔内。其指令格式如下 :

[address1[ ,address2]] w 它檔名称

++函数参数 y 表示转换数据中的字符。其指令格式如下 :
[address1[ ,address2]]y /xyz…/abc…/
#其中 abc… 与 xyz… 的字符个数必须相同,a字符转换成x字符、b转成y、c转成z…
sed -e ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’ input.dat #字母大小的转换。

++函数参数 ! 表示不执行函数参数。当有如下指令时 ,
[address1[ , address2]] ! 函数参数
sed -e ‘/1996/!d’ input.dat  #删除 除了含 “1996″ 字符串外的所有行

++参数n表示读入下一行资料。其指令格式如下:
[address1[ ,address2]] n
sed -n -e ‘n’ -e ‘p’ infro.dat #输出 input.dat 文件内偶数行资料

++函数参数 q 表示跳离 sed 。其指令格式如下:
[address1] q

++函数参数 = 表示印出资料的行数。其指令格式如下:
[address1 ,[address2]] =
sed -e ‘=’ input.dat   #印出资料的行数

++ 函数参数#后的文字为注解,当注解超过多行时,其行间须以”/”换行字符相隔

++函数参数 N 表示添加下一笔资料在 pattern space 内。其指令格式如下:
[address1 ,[address2]] N
#将下述两行数据合并。假设 input.dat 的内容如下 :
#The UNIX
#Operating System
sed -e ‘N’ -e ’s//n/ /’ input.dat

++函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下:
[address1,address2]D
#函数参数 D 与 d 的比较如下 :
当 pattern space 内只有一数据行时 , D 与 d 作用相同。
当 pattern space 内有多行资料行时
D 表示只删除 pattern space 内第一行资料 ; d 则全删除。
D 表示执行删除后 , pattern space 内不添加下一笔数据 , 而将剩下的数据重新执行 sed script ; d 则读入下一行后执行 sed script。

++函数参数 P 表示印出 pattern space 内的第一行资料。其指令格式如下:
[address1,address2] P

++输出 input.dat 文件内奇数行资料。假设 input.dat 檔内容如下:
#The
#UNIX
#System
sed -n -e ‘N’ -e ‘P’ infro.dat
#说明: 在命令列上
#以选项 -n , 将数据输出的控制权(参照[section2.5])转给指令。
#利用函数参数 N 将偶数行添加至 pattern space 内奇数行后。
#利用函数参数 P 将 pattern space 内的第一行(奇数行)输出。
#在奇数行输出后 , pattern space 内剩下的数据行(偶数行)则被放弃输出。最后 , 整个输出只有原先的奇数行数据。

++函数参数 h 表示暂存 pattern space 的资料至 hold space。其指令格式如下:
[address1 ,[address2]] h
#函数参数H与h唯一差别是,sed执行h时,数据盖掉(overwrite) hold space内原来的数据,而H,数据则是”添加(append)”在 hold space 原来数据后.

++函数参数 g 表示与函数参数 h 相反的动作 , 它表示将 hold space 内资料放回 pattern space 内。其指令格式如下 :
[address1,address2]g
#函数参数G与g唯一差别是,sed 执行g时,数据盖掉(overwrite) pattern space内原来的数据,而G,数据则是”添加(append)”在 pattern space原来数据后.

++函数参数 x 表示交换 hold space 与 pattern space 内的数据。其指令格式如下 :
[address1 ,[address2]] x
sed -e ‘1h’ -e ‘3x’ input.dat   #将 input.dat 文件内第 1 行资料取代第 3 行资料
#以函数参数 h 将第 1 资料存入 hold space ; 当第 3 行数据出现在 pattern space , 以函数参数 x 交换 hold space 与 pattern space 的内容。如此 , 第 3 行资料就被第 1 资料替代。

++ b、:label
函数参数 : 与函数参数 b 可在 sed script 内建立类似 BASIC 语言中 GOTO 指令的功能。其中 , 函数参数 : 建立标记;函数参数 b 将下一个执行的指令 branch 到标记处执行。函数参数 : 与 b , 在 script file 内配合的情况如下
编辑指令m1
:记号
编辑指令m2
[address1,[address2]]b [记号]
其中 , 当 sed 执行至指令 [address1,[address2]]b [记号] 时 , 如 pattern space 内的数据符合地址参数 , 则 sed 将下一个执行的位置 branch 至由 :记号(批注[14])设定的标记处 , 也就是再由 “编辑指令m2″ … 执行。另外 , 如果指令中函数参数 b 后没有记号 , 则 sed 将下一个执行的指令 branch 到 script file 的最后 , 利用此可使 sed script 内有类似 C 语言中的 case statement 结构。
#将 input.dat 文件内数据行的开头字母重复印 40 次。假设 input.dat 檔的内容如下 :
A
B
C
#sed 命令列如下 :
sed -e ‘{
:p1
/A/s/A/AA/
/B/s/B/BB/
/C/s/C/CC/
/[ABC]/{40/}/b
b p1
}’ input.dat

++基本上 , 函数参数 t 与 函数参数 b 的功能类似 , 除了在执行 t 的 branch 前 , 会先去测试其前的替换指令有没有执行替换成功外。在 script file 内的情况如下:
编辑指令m1
:记号
编辑指令m2
s/…/…/
[address1,[address2]]t [记号]
编辑指令m3
其中 , 与函数参数 b 不同处在于 , 执行函数参数 t branch 时 , 会先检查其前一个替换指令成功与否。如成功 , 则执行 branch ; 不成功 , 则不 branch , 而继续执行下一个编辑指令
##将 input.dat 文件中资料 A1 替换成 C1、C1 替换成 B1、B1 替换成 A1。input.dat 檔的内容如下:
代号
B1
A1
B1
C1
A1
C1
说明 : input.dat 文件中全部数据行只需要执行一次替换动作 , 但为避免数据被替换多次 , 所以利用函数参数 t 在 sed script 内形成一类似 C 语言中 case statement 结构 , 使每行数据替换一次后能立即用函数参数 t 跳离替换编辑。
sed 命令列 :
sed -e ‘{
s/A1/C1/
t
s/C1/B1/
t
s/B1/A1/
t
}’ input.dat

++常用的 regular expression
普通字符  由普通字符所组成的 regular expression 其意义与原字符串字面意义相同。
^字符串  限制字符串必须出现于行首 。
$字符串  限制字符串必须出现行尾。
.  表示任意一字符。
[...]  字符集合, 用以表示两中括号间所有字符当中的任一个 ,如 [^...]表示两中括号间所有字符以外的字符。
-&  字符集合中可用”&”指定字符的范围。
*  用以形容其前的字符(或字符集合)可重复任意多次 。
/n  表示嵌入新行字符(imbedded new line character)。
/(…/)  于 regular expression 中使用”/(” “/)”来括住一部份的 regular expression ; 其后可用”/1″来表示第一个被”/(” “/)”括住的部份。若 regular expression 中使用数次的”/(” “/)”来括住不同的部份 , 则依次使用”/1″,”/2″,”/3″,…(最多可到”/9″)。

### 基于Unity3D的ACT游戏的设计与实现 #### 摘要与关键词解析 本项目聚焦于使用Unity3D引擎开发一款2D动作类游戏(ACT),旨在为玩家提供沉浸式的游戏体验以及成就感。游戏开发过程中,作者不仅关注游戏的核心玩法,还深入探讨了如何利用Unity内置的各种工具和技术来提升游戏性能、改善用户体验。 **关键词**: - **Unity**:一个跨平台的综合游戏开发引擎,支持2D和3D游戏开发。 - **ScriptableObject**:Unity中的一种特殊脚本类型,用于存储数据和配置信息,方便在多个场景间共享。 - **游戏开发**:涵盖了游戏设计、编程、美术创作等多个方面的工作。 - **2D游戏**:指采用二维画面的游戏,相比3D游戏,具有更简洁的视觉风格和较低的技术门槛。 - **状态机**:一种常用的编程模式,用于管理游戏对象的状态转换,如角色的动作变化等。 - **Cinemachine**:Unity的一个插件,提供了高级的相机控制系统,能够创建出电影级的摄像机动画效果。 #### 第1章:绪论 在本章中,作者首先阐述了游戏开发的背景及意义。随着科技的进步,数字娱乐已经成为人们生活中不可或缺的一部分,而游戏作为其中的一种形式,更是受到了广泛的关注。游戏不仅能够提供娱乐,还能培养玩家的逻辑思维能力和解决问题的能力。因此,开发高质量的游戏产品显得尤为重要。 随后,作者介绍了本项目的起源和发展过程,包括为何选择Unity作为开发工具,以及项目的目标和预期成果。此外,作者还提到了Unity引擎的特点及其在游戏开发中的优势,比如跨平台兼容性、丰富的资源库、强大的社区支持等。 #### 技术选型与实现细节 1. **C#语言**:Unity主要使用的编程语言是C#,它是一种面向对象的语言,具有良好的可读性和扩展性。在本项目中,C#被用来编写游戏逻辑、实现用户交互等功能。 2. **UGUI和Text Mesh Pro**:UGUI是Unity提供的用户界面系统,可以轻松地创建各种界面元素,如按钮、滑块等。Text Mesh Pro则是一款高级文本渲染插件,能够提高文本的渲染质量和性能,使得游戏中的文字更加清晰易读。 3. **有限状态机**:状态机是一种常见的游戏开发模式,用于管理和控制游戏对象的不同状态。在本项目中,状态机被用来处理游戏角色的动作变化,例如攻击、跳跃、行走等。通过这种方式,可以更加高效地组织代码,提高游戏逻辑的清晰度和可维护性。 4. **ScriptableObject**:这是一种特殊的脚本类型,在Unity中主要用于存储数据和配置信息。通过ScriptableObject,开发者可以在编辑器中直接编辑这些数据,而无需重启游戏。这种机制极大地提高了开发效率,并且使得多人协作变得更加容易。 5. **物理系统**:Unity内置的物理引擎能够模拟真实的物理行为,如重力、碰撞等。在本项目中,物理系统被用来处理角色和环境之间的互动,确保游戏中的物理效果逼真可靠。 #### 测试与优化 为了确保游戏的质量,作者进行了多轮的测试,包括功能测试、性能测试以及玩家体验测试。通过不断地调整和优化,最终实现了游戏在低配置设备上的流畅运行。 **总结**: 通过上述分析可以看出,《基于Unity3D的ACT游戏的设计与实现》项目不仅关注游戏本身的玩法设计,还深入探讨了如何利用先进的技术和工具来提高游戏的品质。从技术选型到具体实现,再到后期的测试与优化,每一个环节都体现了作者的专业水平和对游戏开发的热情。对于想要进入游戏开发领域的初学者来说,该项目提供了一个非常好的学习案例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值