Linux文件名正则,linux之正则表达式篇

2228AADCE1CC41DA99E4DAE361AFCFF0

shell环境设定

shell也是一个应用程序,工作在用户模式,运行表现为一个进程,通过pstree可以查看到bash进程。

shell 进程用于通过命令行界面,类似windows的explore资源管理器。

bourn:开发shell ,bsh-->sh

BSD:研发csh

korn:研发ksh(商业版,功能强大)。

bash-->bourn again shell,Bash-->开源,bsh的增强版

shell本身是解释器,能够理解其他命令,并且让命令执行起来。理解语句,更具流程控制机制让语句按需要执行。

读一句执行一句。

编译器:理解源程序,并且能够将源程序转换成二进制代码后执行。

先将这个源程序转换成二进制格式再执行。

编译器:gcc

解释器:bash python、perl

在编写解释型程序的时候,由于需要解释器进行逐条解释,所有在程序的开头要写明解释器程序的位置。比如:”#!/bin/bash“

变量:内存空间的外在表现,是内存空间名称,用于存储数据。

变量类型:数据存储格式,数据表示范围:

整型:

浮点型:

字符型:

布尔型:

字符:ascii,所有基本字符一共128个,至少需要7bits来表示所有的基本字符。

浮点:单精度,双精度

使用变量的步骤(c、java):

1、声明:给定一个变量类型。

2、声明的同时给其一个初始值,这个过程叫初始化。

3、赋值: int v=2

shell中的 变量

属于弱类型语言:

1、不强制区分变量类型,无论存储什么数据,均默认是字符格式存储。

2、不需要事先声明。直接使用,直接赋值。

定义变量

[set]   var_name=value 有空格加“”

引用变量:

${var_name} 通常‘{}’可以省略。{}通常用于对变量所定义数值的扩展

比如: curname=gong

echo “i am $curname”

echo  "she is ${curname}ziyan"

撤销变量:

unset    var_name

bash变量类型:

本地变量:只对当前shell进程有效,退出登录后无效。

局部变量:对小范围代码段有效。其作用范围不包括当前shell的所有位置。

设置方法:local var_name=value

环境变量:对当前shell及子shell有效(可以通过命令“bash”进入子shell)。

设置方法:export var_name=value

位置变量:$1/$2.........

特殊变量:$$、$!、$?.........

bash变量也可以声明,并指定类型:declare

declare -i var_name:声明一个整型变量。

declare -x var_name:声明一个环境变量。

declare -a var_name:声明一个数组。

bash中如何查看环境变量:

printenv、export

查看所有变量:set

变量的引用:${var_name}

变量替换:只能在双引号中实现。

bash的引号:

双引号:可以实现变量的替换。

单引号:不替换,并且显示字符串本身。

比较:name= 'good dog'

echo  this is“$name”

echo this is ‘$name’

反引号:命令引用,引用反引号命令的执行结果。

BingGongtekiMacBook-Pro:~ binggong$ echo "this is `date +%T`"

this is 14:36:47

$( )应用执行结果

BingGongtekiMacBook-Pro:~ binggong$ echo "nihao $(date)"

nihao 2016年10月20日 星期四 14时27分52秒 CST

bash 命令行快捷方式:

ctrl+u:删除命令行首至当前光标所在位置的内容。

ctrl+k:删除当前光标到行尾的内容。

ctrl+a:跳至行首部

ctrl+e:跳至行尾部

ctrl+l:清屏,相当于clear

ctrl+c:终止程序

ctrl+z:将当前命令送至后台执行。

语言控制结构:

1、顺序执行

2、选择执行

3、循环执行

当alias的定义别名与元命令名相同的时候,使用元命令时可以在命令前加\来表示。

文件名通配符

?:用于匹配一个任意字符

*:用来匹配文件名中的任意字符串,匹配长度可以是0-n个

[]:匹配[]内的任意一个字符

-可以表示一个范围[a-z]

[acdf]表示任意一个字符

[!abdf]不匹配括号内adbf的任意字符

多条命令中的逻辑运算符合括号

command1 || command2:逻辑或运算,command1执行成功就不执行command2,否则会执行command2,两者选其一。

command1 && command2:逻辑与运行,command1执行成功才执行command2命令。

(command1;command2):优先执行()内部的命令,并按顺序执行

{command1;command2}:调用子shell命令并执行{}内部的命令,其实质是函数。

正则表达式:命令输出或者文本内容筛选查找。

使用位置:grep、awk、sed、vim

grep:支持基本的正则表达式,只针对文件进行查找工作

egrep:支持扩展正则表达式

tgrep:不支持正常表达式元字符,搜索字符串速度快。

正则表达式是一类字符所书写的模式。

元字符:不表示字符本身的意义,而用于额外功能的描述。通常元字符有两类,一类匹配具体的字符,一类匹配位置,比如行首行尾。

^:瞄定行首的符合条件的字符表达式。 grep --color=auto ^ssh /etc/passwd

$:锚定行尾的符合条件的内容,用法“name$”

^$:空白行

.:匹配任意单个字符。

*:匹配紧挨在其前面的字符任意次数。

[]:配置指定范围内的任意单个字符。

[^]:匹配任意指定范围外的单个字符。

[:lower:]:小写

[:upper:]:大写

[:digit:]:数字

[:space;]:空白字符

\?:匹配紧挨在其前面的字符0-1次。

x\{m,n\}:匹配其前面的字符至少m次,最多n次。

x\{0,n\}:至多n次

x\{m,\}:至少m次

x\{m\}:精确匹配只有m次。

\<:>

\>:锚定词尾,用于定位单词,表示单词的结尾是指定的内容比如: \>word

\:完全锚定某一个单词。

\(\):分组,将括号内的当成一个内容使用。当要求后面的内容和前面分组的内容相同时,可以使用\1来表示,1表示第几个分组。

用法:\(parttern\)      例如:grep '\(s.x\).*\1 /etc/passwd

例如:grep '^s\{1,2\}.*' /etc/passwd

grep “[bB].\{2,6\}[tT]”/etc/passwd

grep "[^]"

组合使用正则表达式

grep的选项:

--color=auto  通过修改全局(环境)变量来改变颜色:export GREP_COLOR='01;33'

-v:反向查找,只输出匹配内容以外的行。

-n:在结果输出的同时,输出行号

-i:不区分大小写。

-o:只显示匹配的字符串,而不是整个行。

-A n:显示匹配到的行时,顺带显示器前面的n行

-B n 后面的n行

-C n:前后的n行。

-E:表示扩展正则表达式,可以使用“|”或方式查找,但不支持与方式,所以需要管道重定向来分开查找。

grep -E 'gongbing|liuhaixiang' student.txt

-l:从多个文件中查找,只输出匹配内容的文件名称。

grep -l "root" /etc/*

-h:从多个文件中查找,只输出匹配的内容,不显示文件名称。

grep -h "root" /etc/*

练习:

显示/etc/rc.d/rc.sysinitd中以#开头,并且后面跟一个或多个空白字符,而后又跟了任意非空白字符。

grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/rc.d/rc.sysinit

1、显示/proc/cpuinfo中的processor开头并且后面跟了一个空字符的行,而后统计相关的行数

2、显示/var/log/secure文件中包含“failed password”或者“failed login”的行;而后统计相关的行数。

3、显示/var/log/secure文件中记录的属于当前系统时间的前一天的信息中包含“failed password”或者“failed login”的行,并统计行数

4、找出netstat -tan 命令执行的结果中以time_wait或者established结尾的行。

显示某文件中的一位数和两位数。

grep  ‘\’/etc/passwd

基本正则表达式:

.   \?    *     \<    $     ^      []    \{n,m\} 等。

扩展正则表达式:

.:任意单个字符

[]:指定范围内的单个字符

[^]:取反

*:任意多个

+:匹配其前面的字符至少1次。

?:0或1次

{n,m}:至少m次,至多n次。

():分组,与基本正则表达式不同的是不需要\

a|b:二选其一。

sort:

-f:忽略大小写

-n:以数字大小写排序(默认是以字符方式排序)

-u:排序过程中删除结果相同的行。

-r:降序排列

-R:随机排序。

uniq:选取唯一值。

-c:统计每行重复的次数。

-u:显示没有重复的行

-d:只显示重复过的行

-t:指定分隔符

-k:指定字段

练习:

查找/etc/passwd文件中使用bash的uid最小的用户名

grep 'bash' /etc/passwd |sort -n -t : -k 3 |head -n 1 |cut -d : -f 1

有变量、转义字符的时候需要使用双引号。

bash的配置文件:

profile类:交互式登陆的用户

/etc/profile (全局,对所有用户有效)

/etc/profile.d/*.sh:全局,对所有用户有效,是对profile的补充。

~/.bash_profile:仅对某用户自己有效。

功能:设置环境变量、运行命令和脚本

basher类:非交互式登陆的用户

/etc/bashrc:全局有效

~/.bashrc:仅对用户自己有效。

功能:设置本地变量、定义用户别名

假定新安装jdk文件,可执行命令为/usr/java/latest,需要指定环境变量(全局)JAVA_HOME。如何操作。

vi /etc/profile,也可在/etc/profile.d/新建一个配置文件(java.sh),来进行配置。

添加: export JAVA_HOME=/etc/java/latest

. /etc/profile.d/java.sh  配置生效

echo $JAVA_HOME    查看

在配置文件更新后,新的定义不会立即生效,要想立即生效有两种方式:

1、重启

2、source file

交互式模式就是shell等待你的输入, 并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。shell也可以运行在另外一种模式:非交互式模式,以shellscript(非交互)方式执行。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了

交互式登陆环境:

1、直接从终端登陆的用户

2、su - username

非交互登陆:

1、su username

2、在图形模式下,打开的一个伪终端。

3、执行脚本

读取bash的顺序:

交互式登陆:

/etc/profile-->/etc/profile.d/*.sh-->~/.bash.profile-->~/.bashrc-->/etc/bashrc 最后执行的优先级高

非交互式登陆:

~/.bshrc-->/etc/bashrc-->/etc/profile.d/*.d

I/O重定向,管道

file disciptor,文件描绘符,FD

标准输入fd:0

标准输出fd:1

错误输出fd:2

将默认数据流改为其他设备,就称为io重定向。

>:覆盖重定向

>>:追加重定向

2>:错误覆盖重定向

2>>:错误追加重定向

ls /usr >/tmp/1 2>/tmp/2 同时对正确和错误的输出进行操作。

&>标准输出和错误输出合并重定向到一个文件

&>>标准输出和错误输出合并追加到一个文件。

输入重定向:

<:>

<<:>

cat >/tmp/123 <

管道的最后一个命令是在当前shell的子shell中执行的,所有不要用变量获取结果。

t命令可以将重定向和管道结合起来使用,就是在将前一个命令的结果输出到屏幕的同时还可以保存到文件,也就是说可以管道到下一个命令中。

SED 非交互式文本编辑器

命令本身并不会更改源文件内容,如果要将修改结果保存下载,请使用输出重定向

sed逐条读取文件并放到模式空间里,通过编辑命令进行执行并将结果保持到保留空间中。

命令格式:

sed [选项] 命令 文本文件名

选项:

-n:不打印全部内容,默认情况是对文本全部内容输出信息。

-e:连接多条编辑命令

-f:指定脚本文件

编辑命令:

p:打印匹配行

=:显示指定的行号

a\:在定位行号后添加新文本信息,\表示换行

i\:在定位行前添加文本信息

c\:用新文本替换定位位置文本内容

d:删除定位行

s:使用替换模式

r:从另一个文件中读文本并替换

一、查找指定范围

1、x:具体行号

sed -n '2p' /etc/passwd

2、x,y:指定行范围,1,7

sed -n '1,10p' /etc/passwd

3、/pattern/:查找包含模式的行,/disk/

sed -n '/nobody/p' /etc/passwd

4、x,/pattern/:从第n行开始到匹配项之间的所有内容

sed -n '/nobody/,$p' passwd

5、/pattern/,y:从匹配内容开始向下到第n行。

sed -n '1,/nobody/p' passwd

6、x,y!:排除指定的范围

sed -n '1,30!p' passwd

7、1,$:显示所有行

8、$:打印最后一行

sed -n '$p' passwd

二、打印行号

1、查找passwd文件中的包含gong用户的所在行号

sed '/gong/=' passwd

三、插入、替换指定内容

1、在passwd文件,包含root的行后插入###############。

sed '/root/'a\ "###########" passwd

2、在passwd文件,包含root的行前插入###############。

sed '/root/'a\ "###########" passwd

3、在passwd文件,包含root的行替换为###############。

sed '/root/'c\ "############" passwd

4、在passwd文件,删除###############。

sed "/####/"d passwd

四、替换文本

s/paterntofind/newpartern/[gpwn]

同i\a\的区别主要是:

i、a替换的是整行,而s替换的查找到的具体内容。

选项

g:全局查找替换所有符合的模式

1、替换passwd文件中的gongbing 为liuhaixing

sed    's/gongbing/liuhaixiang/g' passwd

2、删除passwd文件中的root

sed 's/root//g' passwd

&:表示对前一个模式所指的内容进行重新引用

比如: sed 's/gongbing/bingle &/g' passwd 表示在gongbing的前面添加一个bingle字符串。

显示文本文件的控制字符

1、cat -v passwd

2、sed '1.$l' passwd       l:小写l表示显示控制符

五、删除行

d:用来删除匹配的行。

sed ‘/^28/d’ /etc/passwd

删除文件中以28开头的行。

sed -ne ‘/[Ll]ixia/d’-e '/shanghai/d' -e p students

多匹配内容之间的删除操作需要-e的配合。

元字符终极总结

字符(Characters)

字符组(Character classes)

元字符(Metacharacter)匹配(Matches)

[abc] simple class匹配a或b或c

[^abc]negation匹配abc之外的任何单个字符

[a-zA-Z] range匹配a到z或A到Z的任何单个字 符

[a-d[m-p]] union等同于[a-dm-p]

[a-z&&[def]] intersection匹配d, e或f

[a-z&&[^bc]] subtraction等同于[ad-z]

预定义字符组(Predefined character classes)元字符(Metacharacter)匹配(Matches)

. dot任何字符,能不能匹配换行符取决于匹配 模式

\d digit数字,等价于[0-9]

\D non-digit非数字,等价于[^0-9]

\s whitespace空白字符,等价于[ \t\n\x0B\f\r]

\S non-whitespace非空白字符,等价于[^\s]

\w word组成单词的字符,等价于[a-zA-Z_0-9]

\W non-word不是组成单词的字符,等价于[^\w]

POSIX字符组

元字符(Metacharacter)匹配(Matches)

[:lower:]:小写

[:upper:]:大写

[:digit:]:数字

[:space;]:空白字符

零长度断言

元字符(Metacharacter)匹配(Matches)

^ caret行首

$ dollar行尾

\bboundary单词边界

\B非单词边界

\

\>单词的结束位置

\A字符串起始位置

\Z字符串结束位置

\z字符串结束位置

\G次匹配的起始位置或上次匹配的结束 位置

(?=...) positive lookahead如果右边能够匹配,则成功

(?!...) negative lookahead如果右边不能够匹配,则成功

(?<=...) positive lookbehind如果左边能够匹配,则成功

(?

贪婪量词

元字符(Metacharacter)匹配(Matches)

X?匹配X 0次或1次

X*匹配X 0次或无数次

X+匹配X 1次或无数次

X{n}匹配X n次

X{n,}匹配X至少n次

X{n,m}匹配X至少n次至多m次

非贪婪量词

元字符(Metacharacter)匹配(Matches)

X?? 匹配X0次或1次

X*? 匹配X0次或无数次

X+?匹配X1次或无数次

X{n}?匹配Xn次

X{n,}? 匹配X至少N次

X{n,m}?匹配X只是N次至多M次

占有量词

元字符(Metacharacter)匹配(Matches)

X?+匹配X 0次或1次

X*+匹配X 0次或无数次

X++匹配X 1次或无数次

X{n}+匹配X n次

X{n,}+匹配X至少n次

X{n,m}+匹配X至少n次至多m次

分组,捕获及后向引用

元字符(Metacharacter)匹配(Matches)

(...)分组或捕获

\n引用第n个括号中匹配的内容

(?...)命名捕获

(?:...)分组

(?>...)固化分组

多选结构

元字符(Metacharacter)匹配(Matches)

a|b|c匹配a或b或c

条件判断

元字符(Metacharacter) 匹配(Matches)(?if then |else)条件为真,则匹配then子表达式,否则匹配else子表达式

匹配模式元字符(Metacharacter)匹配(Matches)

(?i:...)不区分大小写的匹配模式

(?x:...)注释模式

(?s:...)单行模式(点号通配模式)

(?m:...)多行模式(增强的行锚点模式)

\Q...\E文字文 模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中实现机械臂的仿真可以使用Robotic System Toolbox来进行。Robotic System Toolbox包含许多工具和函数,可以实现机械臂的建模、控制和仿真。 首先,需要定义机械臂的模型。可以使用robotics.RigidBodyTree类来创建机械臂的刚体树结构。通过添加关节和刚体可以构建机械臂的结构。可以使用函数robotics.RigidBody来创建刚体,并使用函数robotics.Joint来创建关节。 接下来,可以使用robotics.RigidBodyTree类中的函数来定义机械臂的初始状态。可以设置每个关节的初始位置和速度。 然后,可以使用robotics.RigidBodyTree类中的函数来进行机械臂的运动控制。可以使用函数robotics.InverseKinematics来实现逆运动学,根据目标位置和姿态来求解关节角度。可以使用函数robotics.CartesianTrajectory来生成机械臂的轨迹,指定起始和目标位置以及运动时间。 最后,可以使用robotics.RigidBodyTree类中的函数来进行机械臂的仿真。可以使用函数robotics.Rate来指定仿真的频率,然后使用循环来更新机械臂的状态和控制输入,实现机械臂的运动。 以下是一个基本的机械臂仿真的示例代码: ```matlab % 创建机械臂模型 robot = robotics.RigidBodyTree; % 添加机械臂的关节和刚体 % 设置机械臂的初始状态 % 运动控制 % 仿真循环 % 绘制机械臂的运动轨迹 ``` 在实际的机械臂仿真中,可能还需要考虑机械臂的动力学、碰撞检测和路径规划等问题。可以使用Robotic System Toolbox中的其他工具和函数来处理这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值