sed / 替换为 _ -e选项 单/双引号 三个\\\ 两个\\ linux shell 分析

本文详细分析了Linux Shell中使用sed命令进行文本替换的技巧,特别是关于-e选项,双引号的使用,以及如何正确处理反斜杠()的转义。在第21行代码中,演示了使用"包裹命令并配合g标志进行全局替换的操作。


[root@localhost expert_shell]# LOGCHKS="/var/log/messages:authentication%20failure:rbpeters:warn /var/log/messages:recv%20failure::error"
[root@localhost expert_shell]# logfile=` |cut -d: -f1`   或者 logfile=`echo $LOGCHKS |awk -F: '{print $1}'`结果也一样
[root@localhost expert_shell]# echo $logfile
/var/log/messages

[root@localhost expert_shell]# logfile1=`echo $LOGCHKS |cut -d: -f2`
[root@localhost expert_shell]# echo $logfile1
authentication%20failure

[root@localhost expert_shell]# logfile1=`echo $LOGCHKS |cut -d: -f3`
[root@localhost expert_shell]# echo $logfile1
rbpeters

[root@localhost expert_shell]# logfile1=`echo $LOGCHKS |cut -d: -f4`
[root@localhost expert_shell]# echo $logfile1
warn /var/log/messages

[root@localhost expert_shell]# logfile1=`echo $LOGCHKS |cut -d: -f2`
[root@localhost expert_shell]# echo $logfile1
authentication%20failure
[root@localhost expert_shell]# strings="`echo $logfile1 |sed -e \"s/%20/ /g\"`"
[root@localhost expert_shell]# echo $strings
authentication failure
[root@localhost expert_shell]# strings="`echo $logfile1 |sed -e 's/%20/ /g'`"
[root@localhost expert_shell]# echo $strings
authentication failure

代码第21行 (注意到sed -e 后用的是\" g后用的也是\"双引号

[root@localhost expert_shell]# strings="`echo $logfile1 |sed -e \"s/%20/ /g\"`"  双引号


和代码第24行(注意到sed -e 后直接用的是' g后用的也直接是'单引号

[root@localhost expert_shell]# strings="`echo $logfile1 |sed -e 's/%20/ /g'`"  单引号

作用相同,都是将%20替换为空格(s/%20/ /g,/ /之间留有空格)。

或者 用\ 后面加个空格也可以表示空格:

strings="`echo $logfile1 |sed -e 's/%20/\ /g'`"

执行结果一样。

用\ 后面加个空格或者/ /之间留个空格两种方式都可以表示空格。

用\ 后面加个空格或者/ /之间留个空格两种方式都可以表示空格。

用\ 后面加个空格或者/ /之间留个空格两种方式都可以表示空格

如果是

sed -e 's/%20/\/g' 或者sed -e 's/%20//g' 
\ 后面不加空格或者/ /之间不留空格,就变成删除的作用了。



以下分析讨论将/var/log/messages 中的 / 替换为 _ (下划线)_var_log_messages的几种情况

实际上,只需如下即可:

[root@localhost sh]# echo $logfile
/var/log/messages
[root@localhost sh]# echo $logfile |sed -e 's/\//_/g'
_var_log_messages
[root@localhost sh]# echo $logfile |sed 's/\//_/g'  去掉了 -e选项
_var_log_messages
或者:

[root@localhost sh]# suffi=`echo $logfile |sed "s/\//_/g"`双引号 无-e
[root@localhost sh]# echo $suffi
_var_log_messages
[root@localhost sh]# suffi=`echo $logfile |sed -e "s/\//_/g"`双引号有-e
[root@localhost sh]# echo $suffi
_var_log_messages

可用-e ,也可不用-e,用\对/进行转义就行了,下面的讨论复杂了,汗……

分:有无-e选项 、 单引号 、双引号、 \\\(三个\\\)和\\(两个\\)的组合进行讨论

[root@localhost expert_shell]# echo $logfile /var/log/messages

[root@localhost expert_shell]# suffix=`echo $logfile |sed -e s/\\\//_/g` [root@localhost expert_shell]# echo $suffix _var_log_messages

去掉了 -e选项,不加单引号和双引号, \\\(三个\\\),执行结果一样

[root@localhost expert_shell]# suffix1=`echo $logfile |sed s/\\\//_/g`    [root@localhost expert_shell]# echo $suffix1 _var_log_messages

去掉了 -e选项,加双引号,\\\(三个\\\),执行结果一样

[root@localhost expert_shell]# suffix4=`echo $logfile |sed  "s/\\\//_/g"` [root@localhost expert_shell]# echo $suffix4 _var_log_messages

去掉了 -e选项,加单引号,\\\(三个\\\),出错

[root@localhost expert_shell]# suffix5=`echo $logfile |sed 's/\\\//_/g'` sed: -e expression #1, char 7: unknown option to `s'

去掉了 -e选项,但是对 s/\\\//_/g  去掉一个\ ,变成s/\\//_/g (三个\\\变成了两个\\) ,并 用双引号” “或者 单引号‘ '将其 引起,执行结果一样

[root@localhost expert_shell]# suffix8=`echo $logfile |sed 's/\\//_/g'`             ###去掉-e选项 单引号' 两个\\ [root@localhost expert_shell]# echo $suffix8 _var_log_messages [root@localhost expert_shell]# suffix9=`echo $logfile |sed "s/\\//_/g"` ###去掉-e选项 双引号" 两个\\ [root@localhost expert_shell]# echo $suffix9 _var_log_messages

仍保留 -e选项,但是对 s/\\\//_/g 用单引号’ ’ 引起,出错

[root@localhost expert_shell]# suffix2=`echo $logfile |sed -e 's/\\\//_/g'` sed: -e expression #1, char 7: unknown option to `s'

仍保留 -e选项,但是对 s/\\\//_/g 用双引号” “ 引起,执行结果一样

[root@localhost expert_shell]# suffix3=`echo $logfile |sed -e "s/\\\//_/g"` [root@localhost expert_shell]# echo $suffix3 _var_log_messages

仍保留 -e选项,但是对 s/\\\//_/g  去掉一个\ ,变成s/\\//_/g (三个\\\变成了两个\\) ,并 用双引号” “或者 单引号‘ '将其 引起,执行结果一样

[root@localhost expert_shell]# suffix6=`echo $logfile |sed  -e "s/\\//_/g"`              ###双引号"  两个\\ [root@localhost expert_shell]# echo $suffix6 _var_log_messages

[root@localhost expert_shell]# suffix7=`echo $logfile |sed  -e 's/\\//_/g'`                   ###单引号'  两个\\ [root@localhost expert_shell]# echo $suffix7 _var_log_messages

一些思考:

在sed 中有时双引号和单引号作用一样,有时却不一样,这究竟是如何引起的呢?

sed 中手册推荐是用单引号,但是双引号也好使,为什么??????????!?!!!!

在awk 中却只能用单引号,用双引号不好使,例如:

[root@localhost temp]# cat oldboy.txt I am oldboy,my qq is 31333741

[root@localhost temp]# cat oldboy.txt |awk '{print $2}' #######单引号好使 am

[root@localhost temp]# cat oldboy.txt |awk "{print $2}"#######双引号不好使,输出全文

I am oldboy,my qq is 31333741

说明双引号和单引号在awk 和sed 中表现出不同的性质,要注意。












                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值