您的位置:首页 > 运维架构 > Shell

shell 字符串操作(转)

2014-11-13 19:40 281 查看
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

得到长度

代码:

%x="abcd"

#方法一

%expr length $x

4

# 方法二

靐o $

4

# 方法三

%expr "$x" : ".*"

4

# expr 的帮助

# STRING : REGEXP anchored pattern match of REGEXP in STRING

查找子串

代码:

%expr index $x "b"

2

%expr index $x "a"

1

%expr index $x "b"

2

%expr index $x "c"

3

%expr index $x "d"

4

得到子字符串

代码:

# 方法一

# expr <string> startpos length

%expr substr "$x" 1 3

abc

%expr substr "$x" 1 5

abcd

%expr substr "$x" 2 5

bcd

# 方法二

# $

靐o $

bcd

靐o $

cd

靐o $

abcd

靐o $

ab

%pos=1

%len=2

靐o $

bc

匹配正则表达式

代码:

# 打印匹配长度

%expr match $x "."

1

%expr match $x "abc"

3

%expr match $x "bc"

0

字符串的掐头去尾

代码:

%x=aabbaarealwwvvww

靐o "$"

aabbaarealwwvv

靐o "$"

aabbaareal

靐o "$"

lwwvvww

靐o "$"

bbaarealwwvvww

其中 , # 表示掐头, 因为键盘上 # 在 $
的左面。

其中 , % 表示%, 因为键盘上 % 在 $ 的右面。

单个的表示最小匹配,双个表示最大匹配。

也就是说,当匹配的有多种方案的时候,选择匹配的最大长度还是最小长度。

字符串的替换

代码:

%x=abcdabcd

靐o $ # 只替换一个

bbcdabcd

靐o $ # 替换所有

bbcdbbcd

不可以使用 regexp , 只能用 * ?
的文件扩展方式

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

对字符串的处理

包括:截取,连接,匹配,替换,翻转... ...

字符串的处理:

1,截取

方法一:

echo $a|awk '{print substr( ,1,8)}'

substr是awk中的一个子函数,对第一个参数的进行截取,从第一个字符开始,共截取8个字符,如果不够就从第二个字符中补

方法二

echo $a|cut -b2-8

cut:对标准输入的字符串进行处理

cut -bn-m:以byte为单位,从第n个byte开始,取m个

cut -bn,m:以byte为单位,截取第n,m个byte

cut -b-n,m:以byte为单位,截取1-n,和第m个

-c:以charactor为单位

-d:指定分隔符,默认为tab

-s:使标准输入中没有delimeter

cut -f1:截取第1个域

方法三

a=123456

echo $

方法四

使用sed截取字符串的最后两位

echo $test |sed 's/\(.*\)\(..\)$//'

截取字符串的前2位

echo $test |sed 's/^\(..\)\(.*\)//'

欢迎访问007电脑资讯

2,比较

好像没有什么可以比较的

3,连接

$a$b

或者

$string

4,翻转

方法一:

使用rev命令

方法二:

编写脚本实现

#!/usr/bin/awk -f

################################################################

# Description : duplicate rev in awk

################################################################

{

revline = ""

for (i=1;i<=length;i++)

{

revline = substr(,i,1) revline

}

}

END{print revline}

5,匹配

grep

egrep

fgrep

6,排序

7,替换

bash中:

%x=abcdabcd

%echo $ # 只替换一个

bbcdabcd

%echo $ # 替换所有

bbcdbbcd

sh中:

??

如何替换/

使用sed

替换所有匹配

echo $test |sed 's/xx/yy'

替换单个匹配

??

8,得到字符串的长度:

bash当中

$

或者

expr "$VAR" : '.*'

9,判断字符串是否为数字

10,得到字符串中某个字符的重复次数

echo $a |tr "x" "\n" |wc -l

得到的结果需要减去1

或者 echo $a |awk -F"x" '{print NF-1}'

11,得到字符串中某个string的重复次数
007电脑资讯

12,将一批文件中的所有string替换

for i in file_list

do

vi $i <<-!

:g/xxxx/s//XXXX/g

:wq

!

done

13,如何将字符串内每两个字符中间插入一个字符

使用sed

echo $test |sed 's/../&[insert char]/g'

============================================================================

象专业人员那样截断字符串

尽管 basename 和 dirname
是很好的工具,但有时可能需要执行更高级的字符串“截断”,而不只是标准的路径名操作。当需要更强的说服力时,可以利用
bash 内置的变量扩展功能。已经使用了类似于
${MYVAR} 的标准类型的变量扩展。但是 bash
自身也可以执行一些便利的字符串截断。看一下这些例子:

第一种方法:

${varible##*string}
从左向右截取最后一个string后的字符串

${varible#*string}从左向右截取第一个string后的字符串

${varible%%string*}从右向左截取最后一个string后的字符串

${varible%string*}从右向左截取第一个string后的字符串

"*"只是一个通配符可以不要

$ MYVAR=foodforthought.jpg

$ echo ${MYVAR##*fo}

rthought.jpg

$ echo ${MYVAR#*fo}

odforthought.jpg

在第一个例子中,输入了
${MYVAR##*fo}。它的确切含义是什么?基本上,在 ${ }
中输入环境变量名称,两个 ##,然后是通配符
("*fo")。然后,bash 取得 MYVAR,找到从字符串
"foodforthought.jpg" 开始处开始、且匹配通配符 "*fo" 的
最长
子字符串,然后将其从字符串的开始处截去。刚开始理解时会有些困难,为了感受一下这个特殊的
"##" 选项如何工作,让我们一步步地看看 bash
如何完成这个扩展。首先,它从 "foodforthought.jpg"
的开始处搜索与 "*fo"
通配符匹配的子字符串。以下是检查到的子字符串:

f??

fo????? MATCHES *fo

foo

food

foodf?????

foodfo????? MATCHES *fo

foodfor

foodfort??

foodforth

foodfortho?

foodforthou

foodforthoug

foodforthought

foodforthought.j

foodforthought.jp

foodforthought.jpg

在搜索了匹配的字符串之后,可以看到 bash
找到两个匹配。它选择最长的匹配,从初始字符串的开始处除去,然后返回结果。

上面所示的第二个变量扩展形式看起来与第一个相同,但是它只使用一个
"#" -- 并且 bash
执行几乎同样的过程。它查看与第一个例子相同的子字符串系列,但是
bash 从初始字符串除去 最短
的匹配,然后返回结果。所以,一查到 "fo"
子字符串,它就从字符串中除去 "fo",然后返回
"odforthought.jpg"。

这样说可能会令人十分困惑,下面以一简单方式记住这个功能。当搜索最长匹配时,使用
##(因为 ## 比 # 长)。当搜索最短匹配时,使用
#。看,不难记吧!等一下,怎样记住应该使用 '#'
字符来从字符串开始部分除去?很简单!注意到了吗:在美国键盘上,shift-4
是 "$",它是 bash 变量扩展字符。在键盘上,紧靠
"$" 左边的是 "#"。这样,可以看到:"#" 位于 "$"
的“开始处”,因此(根据我们的记忆法),"#"
从字符串的开始处除去字符。您可能要问:如何从字符串末尾除去字符。如果猜到我们使用美国键盘上紧靠
"$" 右边 的字符
("%),那就猜对了。这里有一些简单的例子,解释如何截去字符串的末尾部分:

$ MYFOO="chickensoup.tar.gz"

$ echo ${MYFOO%%.*}

chickensoup

$ echo ${MYFOO%.*}

chickensoup.tar

正如您所见,除了将匹配通配符从字符串末尾除去之外,%
和 %% 变量扩展选项与 # 和 ##
的工作方式相同。请注意:如果要从末尾除去特定子字符串,不必使用
"*" 字符:

MYFOOD="chickensoup"

$ echo ${MYFOOD%%soup}

chicken

在此例中,使用 "%%" 或 "%"
并不重要,因为只能有一个匹配。还要记住:如果忘记了应该使用
"#" 还是 "%",则看一下键盘上的 3、4 和 5
键,然后猜出来。

第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在
bash 中输入以下行:

$ EXCLAIM=cowabunga

$ echo ${EXCLAIM:0:3}

cow

$ echo ${EXCLAIM:3:7}

abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

应用字符串截断

现在我们已经学习了所有截断字符串的知识,下面写一个简单短小的
shell
脚本。我们的脚本将接受一个文件作为自变量,然后打印:该文件是否是一个
tar 文件。要确定它是否是 tar
文件,将在文件末尾查找模式
".tar"。如下所示:

mytar.sh -- 一个简单的脚本

#!/bin/bash

if [ "${1##*.}" = "tar" ]

then

echo This appears to be a tarball.

else

echo At first glance, this does not appear to be a tarball.

fi

要运行此脚本,将它输入到文件 mytar.sh
中,然后输入 "chmod 755
mytar.sh",生成可执行文件。然后,如下做一下 tar
文件试验:

$ ./mytar.sh thisfile.tar

This appears to be a tarball.

$ ./mytar.sh thatfile.gz

At first glance, this does not appear to be a tarball.

好,成功运行,但是不太实用。在使它更实用之前,先看一下上面使用的
"if" 语句。语句中使用了一个布尔表达式。在 bash
中,"=" 比较运算符检查字符串是否相等。在 bash
中,所有布尔表达式都用方括号括起。但是布尔表达式实际上测试什么?让我们看一下左边。根据前面所学的字符串截断知识,"${1##*.}"
将从环境变量 "1"
包含的字符串开始部分除去最长的 "*."
匹配,并返回结果。这将返回文件中最后一个 "."
之后的所有部分。显然,如果文件以 ".tar"
结束,结果将是 "tar",条件也为真。

您可能会想:开始处的 "1"
环境变量是什么。很简单 -- $1
是传给脚本的第一个命令行自变量,$2
是第二个,以此类推。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: