在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@>" | sed 's/'//g'
>
可以看到,出现了'>'字符,说明认为还没有输入完,根本不能得到想要的结果。这种情况,即使在单引号前边加上转义字符(\)也是不可以的,如下所示:
$ echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@>" | sed 's/\'//g'
>
可以看到,单引号前加入了转义字符,结果还是一样。那应该怎样解决这个问题?
这里要感谢以下链接提供的方法和思路:
sed替换单引号 - 百度文库
其中提供了很多种方法,本文中只采用了其中的两种方法。
方法1:将sed最外层的单引号改为双引号
$ echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@>" | sed "s/'//g"
Copyright (C) 2005 Paolo Blaisorblade Giarrusso <blaisorblade@>
可以看到,原来文本中Blaisorblade前后的2个单引号被去掉了。
方法2:对于单引号进行特殊处理
$ echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@>" | sed 's/'"'"/'/g'
Copyright (C) 2005 Paolo Blaisorblade Giarrusso <blaisorblade@>
可以看到,结果和方法一种一致。
此方法解释如下:
's/':要进行替换操作,后紧跟匹配字符
"'":实际是这样" ' "(这里是让大家看得清楚,实际上不能加空格),两个双引号中间是单引号,即用双引号包裹单引号
/:分隔符
'/g':分隔符,全局替换。
测试脚本如下:
#!/bin/bash
ori_str="Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@>"
#echo "2006-11-21 22:16:30" | sed 's/-//g' | sed 's/ //g' | sed 's/://g'
#echo "Copyright (C) 2005 Paolo 'Blaisorblade' Giarrusso <blaisorblade@>" | sed "s/'//g"
str1=$(echo "$ori_str" | sed "s/'//g")
echo "str1: $str1"
str2=$(echo $ori_str | sed 's/'"'"/'/g')
echo "str2: $str2"