操作字符串
--------------
Bash支持超多的字符串操作,操作的种类和数量令人惊异.但不幸的是,这些工具缺乏集中性.
一些是参数替换的子集,但是另一些则属于UNIX的expr命令.这就导致了命令语法的不一致和
功能的重叠,当然也会引起混乱. 1、字符串长度
${#string}
expr length $string
expr "$string" : '.*' stringZ=abcABC123ABCabc echo ${#stringZ}
echo `expr length $stringZ`
echo `expr "$stringZ" : '.*'` 2、从字符串开始的位置匹配子串的长度
expr match "$string" '$substring' $substring是一个正则表达式
expr "$string" : '$substring' $substring是一个正则表达式 stringZ=abcABC123ABCabc
echo `expr match "$stringZ" 'abc[A-Z]*.2'`
echo `expr "$stringZ" : 'abc[A-Z]*.2'`
3、索引
expr index $string $substring 匹配到子串的第一个字符的位置.
stringZ=abcABC123ABCabc
echo `expr index "$stringZ" C12` echo `expr index "$stringZ" 1c`
# 'c' (in #3 position) matches before '1'. 在C语言中最近的等价函数为strchr().
提取子串
${string:position}
在string中从位置$position开始提取子串.
如果$string为"*"或"@",那么将提取从位置$position开始的位置参数,[1]
${string:position:length}
在string中从位置$position开始提取$length长度的子串. ################################StartScript######################################
stringZ=abcABC123ABCabc
# 0123456789.....
# 0-based indexing. echo ${stringZ:0} # abcABC123ABCabc
echo ${stringZ:1} # bcABC123ABCabc
echo ${stringZ:7} # 23ABCabc
echo ${stringZ:7:3} # 23A
# 3个字符长度的子串.
# 有没有可能从字符结尾开始,反向提取子串? echo ${stringZ:-4} # abcABC123ABCabc
# 以${parameter:-default}方式,默认是提取完整地字符串.
# 然而 . . .
echo ${stringZ:(-4)} # Cabc
echo ${stringZ: -4} # Cabc
# 现在,它可以工作了.
# 使用圆括号或者添加一个空格来转义这个位置参数. 如果$string参数为"*"或"@",那将最大的提取从$position开始的$length个位置参数. echo ${*:2} # Echo出第2个和后边所有的位置参数.
echo ${@:2} # 与前边相同.
echo ${*:2:3} # 从第2个开始,Echo出后边3个位置参数.
expr substr $string $position $length
在string中从位置$position开始提取$length长度的子串.
stringZ=abcABC123ABCabc
# 123456789......
# 1-based indexing. echo `expr substr $stringZ 1 2` # ab
echo `expr substr $stringZ 4 3` # ABC expr match "$string" '\($substring\)'
从$string的开始位置提取$substring,$substring是一个正则表达式. expr "$string" : '\($substring\)'
从$string的开始位置提取$substring,$substring是一个正则表达式.
stringZ=abcABC123ABCabc echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1
echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1
echo `expr "$stringZ" : '\(.......\)'` # abcABC1
# All of the above forms give an identical result.
子串削除
${string#substring}
从$string的左边截掉第一个匹配的$substring
${string##substring}
从$string的左边截掉最后一个个匹配的$substring
stringZ=abcABC123ABCabc
# |----|
# |----------| echo ${stringZ#a*C} # 123ABCabc
# 截掉'a'和'C'之间最近的匹配. echo ${stringZ##a*C} # abc
# 截掉'a'和'C'之间最远的匹配. ${string%substring}
从$string的右边截掉第一个匹配的$substring
${string%%substring}
从$string的右边截掉最后一个匹配的$substring stringZ=abcABC123ABCabc
# ||
# |------------| echo ${stringZ%b*c} # abcABC123ABCa
# 从$stringZ的后边开始截掉'b'和'c'之间的最近的匹配 echo ${stringZ%%b*c} # a
# 从$stringZ的后边开始截掉'b'和'c'之间的最远的匹配 Example 9-11 利用修改文件名,来转换图片格式
################################StartScript######################################
#!/bin/bash
# cvt.sh:
# 把一个目录下的所有MacPaint格式的图片文件都转换为"pbm"格式的图片文件. # 使用来自"netpbm"包的"macptopbm"程序,
#+ 这个程序主要是由Brian Henderson(bryanh@giraffe-data.com)来维护的.
# Netpbm是大多数Linux发行版的标准部分. OPERATION=macptopbm
SUFFIX=pbm # 新的文件名后缀 if [ -n "$1" ]
then
directory=$1 # 如果目录名作为第1个参数给出...
else
directory=$PWD # 否则使用当前的工作目录.
fi # 假设在目标目录中的所有文件都是MacPaint格式的图片文件,
#+ 以".mac"为文件名的后缀. for file in $directory/* # Filename globbing.
do
filename=${file%.*c} # 去掉文件名的".mac"后缀
#+ ('.*c' matches everything
#+ ('.*c' 将匹配'.'和'c'之间的任何字符串). $OPERATION $file > "$filename.$SUFFIX"
# 转换为新的文件名.
rm -f $file # 转换完毕后删除原有的文件.
echo "$filename.$SUFFIX" # 从stdout输出反馈.
done exit 0 # 修改这个脚本,让他只转换以".mac"为后缀的文件.
################################EndScript#######################################
一个简单的模拟getopt命令的办法就是使用子串提取结构.
Example 9-12 模仿getopt命令
################################StartScript######################################
#!/bin/bash
# getopt-simple.sh
# Author: Chris Morgan
# 授权使用在ABS Guide中. getopt_simple()
{
echo "getopt_simple()"
echo "Parameters are '$*'"
until [ -z "$1" ]
do
echo "Processing parameter of: '$1'"
if [ ${1:0:1} = '/' ]
then
tmp=${1:1} # 去掉开头的'/' . . .
parameter=${tmp%%=*} # 提取名字.
value=${tmp##*=} # 提取值.
echo "Parameter: '$parameter', value: '$value'"
eval $parameter=$value
fi
shift
done
} # 传递所有的选项到getopt_simple().
getopt_simple $* echo "test is '$test'"
echo "test2 is '$test2'" exit 0 --- sh getopt_example.sh /test=value1 /test2=value2 Parameters are '/test=value1 /test2=value2'
Processing parameter of: '/test=value1'
Parameter: 'test', value: 'value1'
Processing parameter of: '/test2=value2'
Parameter: 'test2', value: 'value2'
test is 'value1'
test2 is 'value2'
################################EndScript#######################################
子串替换
${string/substring/replacement}
使用$replacement来替换第一个匹配的$substring.
${string//substring/replacement}
使用$replacement来替换所有匹配的$substring. 1 stringZ=abcABC123ABCabc
2
3 echo ${stringZ/abc/xyz} # xyzABC123ABCabc
4 # 用'xyz'来替换第一个匹配的'abc'.
5
6 echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
7 # 用'xyz'来替换所有匹配的'abc'. ${string/#substring/replacement}
如果$substring匹配$string的开头部分,那么就用$replacement来替换$substring.
${string/%substring/replacement}
如果$substring匹配$string的结尾部分,那么就用$replacement来替换$substring.
1 stringZ=abcABC123ABCabc
2
3 echo ${stringZ/#abc/XYZ} # XYZABC123ABCabc
4 # 用'XYZ'替换开头的'abc'
5
6 echo ${stringZ/%abc/XYZ} # abcABC123ABCXYZ
7 # 用'XYZ'替换结尾的'abc' 9.2.1 使用awk来操作字符串
~~~~~~~~~~~~~~~~~~~~~~~~~
Bash脚本也可以使用awk来操作字符串.
Example 9-13 提取字符串的一种可选的方法
################################StartScript######################################
#!/bin/bash
# substring-extraction.sh String=23skidoo1
# 012345678 Bash
# 123456789 awk
# 注意,对于awk和Bash来说,它们使用的是不同的string索引系统:
# Bash的第一个字符是从'0'开始记录的.
# Awk的第一个字符是从'1'开始记录的. echo ${String:2:4} # 位置3 (0-1-2), 4 个字符长
# skid # awk中等价于${string:pos:length}的命令是substr(string,pos,length).
echo | awk '
{ print substr("'"${String}"'",3,4) # skid
}
'
# 使用一个空的"echo"通过管道给awk一个假的输入,
#+ 这样可以不用提供一个文件名.

shell字符串操作技巧的更多相关文章

  1. linux shell 字符串操作(长度,查找,替换)详解

    linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...

  2. shell字符串操作详解

    shell字符串操作详解的相关资料. 1.shell变量声明的判断  表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...

  3. Shell字符串操作

    @1:子串削除 ${string#substring} 从$string 的开头位置截掉最短匹配的$substring. ${string##substring} 从$string 的开头位置截掉最长 ...

  4. linux shell 字符串操作

    转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作 ...

  5. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  6. (正则表达式)linux shell 字符串操作(长度,查找,替换,匹配)详解

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  7. linux shell 字符串操作详解(获取长度、查找,替换)

    在做shell批处理程序时候,常常会涉及到字符串相关操作.有许多命令语句,如:awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,大家知道,使用内部操作符会省 ...

  8. linux shell 字符串操作(长度,查找,替换)

    感谢原创,文章很有帮助. 转自:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 一.判断读取字符串值 表达式 含义 ${v ...

  9. shell在一个大文件找出想要的一段字符串操作技巧

    昨天端午,晚上的时候接了一个电话,我朋友的公司,数据库被两个工作没多久的phper给弄坏了,具体就是把一个字段值,给全表弄成一个了名字了,当然这个是可以配置了禁止全表更新数据库,这下可急坏了,找到我, ...

随机推荐

  1. poj3252Round Numbers【组合数】【数位dp】

    Round Numbers The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, ...

  2. 前端开发组件化设计vue,react,angular原则漫谈

    前端开发组件化设计vue,react,angular原则漫谈 https://www.toutiao.com/a6346443500179505410/?tt_from=weixin&utm_ ...

  3. select.select的使用注意事项

    1.select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制. 2.select()所维护的存储 ...

  4. redis 数据迁移

    最近有个项目因为要搬迁服务器的原因,去找了服务器公司的运维,需要收费,于是果断决定自己实现这个功能.现在百度上已经一大把redis数据库迁移的教程,大部分是利用主从复制或者利用redis的RDB备份之 ...

  5. Chart控件的使用实例

    ChartTest.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&quo ...

  6. BUG笔记:Firefox select选项右侧边框没了

    Firefox 的default select在某些情况下右侧边框会消失.截图如下: 这个目前为止没有看到有任何解决方案,HACK也没有...囧... 有高人知道吗?

  7. linux 安装mysql yum方式

    centos 6 #二进制rpm包安装 yum -y install mysql-server mysql centos7 mariadb和mysql一样的 只是一个分支 防止 mysql 被Orac ...

  8. AMR格式语音采集/编码/转码/解码/播放

    1.opencore-amr源码下载 https://sourceforge.net/projects/opencore-amr/files/opencore-amr/ 2.opencore-amr编 ...

  9. There are 2 missing blocks. The following files may be corrupted

    There are 2 missing blocks. The following files may be corrupted: 步骤1,检查文件缺失情况 可以看到, blk_1074785806 ...

  10. SQLAlchemy通过models创建数据库表

    原地址:http://blog.csdn.net/jmilk/article/details/53184903 定义数据模型 models SQLAlchemy 允许我们根据数据库的表结构来创建数据模 ...