shell字符串操做

获得长度
代码:

%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 , 只能用 * ? 的文件扩展方式

-------------------------------------------------------------------------------------------------------------------------------------------------------------
html

对字符串的处理
包括:截取,链接,匹配,替换,翻转... ... 
字符串的处理:
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

在此例中,使用 "%%" 或 "%" 并不重要,由于只能有一个匹配。还要记住:若是忘记了应该使用 "#" 仍是 "%",则看一下键盘上的 三、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 是第二个,以此类推。
 
转载自:http://www.cnblogs.com/kentyshang/archive/2007/07/11/814279.html
相关文章
相关标签/搜索