zl程序教程

您现在的位置是:首页 >  工具

当前栏目

shell中利用sed命令去掉文本中的单引号(‘)

命令shell 利用 文本 去掉 sed 单引号
2023-09-14 09:09:19 时间

在shell中进行字符替换或者去掉字符,一般使用sed命令。比如以下示例:

$ echo "2006-11-21 22:16:30" | sed 's/-//g' | sed 's/ //g' | sed 's/://g'
20061121221630

但是如果原始字符串中要被替换的是单引号('),那么此时使用以上命令就行不通了,如以下示例:

$ echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>" | sed 's/'//g'
> 

可以看到,出现了'>'字符,说明认为还没有输入完,根本不能得到想要的结果。这种情况,即使在单引号前边加上转义字符(\)也是不可以的,如下所示:

$ echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>" | sed 's/\'//g'
> 

可以看到,单引号前加入了转义字符,结果还是一样。那应该怎样解决这个问题?

这里要感谢以下链接提供的方法和思路:

sed替换单引号 - 百度文库

其中提供了很多种方法,本文中只采用了其中的两种方法。

方法1:将sed最外层的单引号改为双引号

$ echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>" | sed "s/'//g"
Copyright (C) 2005 Paolo Blaisorblade Giarrusso <blaisorblade@yahoo.it>

可以看到,原来文本中Blaisorblade前后的2个单引号被去掉了。

方法2:对于单引号进行特殊处理

$ echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>" | sed 's/'"'"/'/g'
Copyright (C) 2005 Paolo Blaisorblade Giarrusso <blaisorblade@yahoo.it>

可以看到,结果和方法一种一致。

此方法解释如下:

's/':要进行替换操作,后紧跟匹配字符

"'":实际是这样" ' "(这里是让大家看得清楚,实际上不能加空格),两个双引号中间是单引号,即用双引号包裹单引号

/:分隔符

'/g':分隔符,全局替换。

测试脚本如下:

#!/bin/bash

ori_str="Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>"

#echo "2006-11-21 22:16:30" | sed 's/-//g' | sed 's/ //g' | sed 's/://g'
#echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>" | sed "s/'//g"
str1=$(echo "$ori_str" | sed "s/'//g")
echo "str1: $str1"
str2=$(echo $ori_str | sed 's/'"'"/'/g')
echo "str2: $str2"