【shell】字符串截取&替换&分割

本文详细介绍了Shell中字符串的处理方法,包括使用双引号、单引号和不使用引号的差异,字符串的截取(按下标和指定字符),替换(从左到右、从右到左和全部替换)以及字符串的分割。重点强调了#和%在截取字符串中的不同用法,以及awk进行字符串分割的应用。
摘要由CSDN通过智能技术生成

目录

一、字符串输出

二、字符串截取

1.根据下标截取

2.根据指定字符截取

(1)使用 # 截取指定字符右边的所有内容

(2)使用 % 截取指定字符左边的所有内容

三、字符串替换

1.替换一个(从左到右)

2.替换一个(从右到左)

3.替换所有

四、字符串分割


一、字符串输出

shell字符串可以用单引号|/双引号包含,也可以不用引号。具体有什么区别呢?看下面的例子:

# 定义姓名变量
name="luna"

str1="hello ${name}!" # 使用双引号
str2='hello ${name}!' # 使用单引号
str3=hello ${name}! # 不使用引号

echo ${str1}
echo ${str2}
echo ${str3}

输出结果为:

hello luna!
hello ${name}!
run.sh:行10: luna!: 未找到命令

总结:
1) 由单引号包围的字符串:

  • 任何字符都会原样输出,在其中使用变量是无效的。
  • 字符串中不能出现单引号,即使对单引号进行转义也不行。


2) 由双引号包围的字符串:

  • 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
  • 字符串中可以出现双引号,只要它被转义了就行。


3) 不被引号包围的字符串

  • 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号包围的字符串一样。
  • 字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

一句话总结:字符串直接用双引号包围,不容易出错。

二、字符串截取

shell字符串截取分两种,一种是根据字符位置(下标)截取;另一种是从指定字符开始截取。

1.根据下标截取

格式为:${string: start :length} 

string:表示源字符串

start:截取字符串的起始位置,注意第一个字符下标为0

length:截取字符串的长度

str="www.baidu.com"
# 想要输出baidu,第一个字符下标为4,字符串“baidu”长度为5
echo ${str:4:5}

# 输出结果为:
baidu

2.根据指定字符截取

这种方式无法指定截取字符串的长度,只能截取指定字符左边或者右边的所有内容。

(1)使用 # 截取指定字符右边的所有内容

格式:${string#*chars} 

其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),*是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。

举个栗子:

str="http://www.baidu.com/luna"
echo ${str#*/}

# 输出结果
/www.baidu.com/luna

这里就会有一个问题,例子中字符串中有多个"/",如果我想要输出的是最后一个"/"后的所有字符,如何表示?

只需要在表达式中多加一个#,就算第一次匹配成功也不会结束,直到最后一次匹配成功。

str="http://www.baidu.com/luna"
echo ${str##*/}

# 输出结果
luna

(2)使用 % 截取指定字符左边的所有内容

 格式:${string%chars*} 

请注意*的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以*应该位于 chars 的右侧。其他方面%#的用法相同,这里不再赘述,仅举例说明:

str="http://www.baidu.com/luna"

echo ${str%www*}
echo ${str%/*}
echo ${str%%/*} # 此处使用了两个%

# 输出结果
http://
http://www.baidu.com
http:

三、字符串替换

1.替换一个(从左到右)

格式:${string/old/new}

 string:源字符串

old:源字符串中要被替换的内容

new:新字符串

从左到右找到string中的第一个old,用new替换。

str="test.zip-test1.zip"
echo ${str/.zip/.ZIP}

# 输出结果
test.ZIP-test1.zip

2.替换一个(从右到左)

格式:${string/%old/new}

从右到左找到string中的第一个old,用new替换。

str="test.zip-test1.zip"
echo ${str/%.zip/.ZIP}

# 输出结果
test.zip-test1.ZIP

3.替换所有

格式:${string//old/new}

 找到string中的所有old字符串,用new替换。

str="test.zip-test1.zip"
echo ${str//.zip/.ZIP}

# 输出结果
test.ZIP-test1.ZIP

四、字符串分割

shell字符串分割方式很多,基础使用掌握一种就够用了,个人倾向于使用awk。

日常使用场景为:按字符分割字符串,取其中第n个。

格式:echo ${str} | awk -F "分隔符" '{print $n}'

---------------- 字符串分割输出------------------------
str="www.baidu.com"

echo ${str} | awk -F "." '{print $1}'
echo ${str} | awk -F "." '{print $2}'
echo ${str} | awk -F "." '{print $3}'

# 输出结果
www
baidu
com

-----------------字符串分割赋值给变量-----------------------

str="hello java shell"
name=$(echo ${str} | awk -F " " '{print $2}')
echo ${name}

# 输出结果
java

本文参考链接:Shell字符串截取(非常详细)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值