linux中sed中用s 替换中遇到的问题
sed替换时候不能用-n,只输出替换的行,为什么????
比如:
sed "2,4s/\"//g" /var/lib/status #可以输出
但是:
sed -n "2,4s/\"//g" /var/lib/status #什么也数不出来了
问题:文件helloword,sh
root@ubuntu:/home/dyx/linux :: # nl -b a helloword.sh
#!/bin/bash
echo "helloword!";
echo "The first parameter:" $;
echo "The second parameter:" $;
echo "The whole parameter is:" $@ echo 'insert-------------------------------';
echo '$0: '$;
echo '$*: '$*;
echo '$@: '$@;
echo '$#: '$#;
echo '$!: '$!;
echo '$?: '$?;
echo '$$: '$$;
想把9到最后的行中单引号变为上引号;
用命令:
:sed '9,$s/\'/\"/g' helloword.sh
一直出现换行符号,不知道为什么,最后查了网上资料,说sed中用s替换最好用双引号“
于是查到:
sed "s/'/\"/g"
可以替换全部的,
之后用
sed "9,$s/'/\"/g"
就不可以了
root@ubuntu:/home/dyx/linux :: # sed "9,$s/'/\"/g"
sed: -e 表达式 #, 字符 : 未知的命令:“"”↵
发现需要在9和$之间留个空格,
root@ubuntu:/home/dyx/linux :: # sed "9,$ s/'/\"/g" helloword.sh
#!/bin/bash
echo "helloword!";
echo "The first parameter:" $;
echo "The second parameter:" $;
echo "The whole parameter is:" $@ echo "insert-------------------------------";
echo "$0: "$;
echo "$*: "$*;
echo "$@: "$@;
echo "$#: "$#;
echo "$!: "$!;
echo "$?: "$?;
echo "$$: "$$;
root@ubuntu:/home/dyx/linux :: # sed "8,$ s/\'/\"/g" helloword.sh
#!/bin/bash
echo "helloword!";
echo "The first parameter:" $;
echo "The second parameter:" $;
echo "The whole parameter is:" $@ "
echo 'insert-------------------------------';"
echo '$0: '$;"
echo '$*: '$*;"
echo '$@: '$@;"
echo '$#: '$#;"
echo '$!: '$!;"
echo '$?: '$?;"
echo '$$: '$$;"
所以只有
sed "8,$ s/'/\"/g" helloword.sh
正确!
不太理解!
当用脚本时:
cat ss.sed
'6,$ s/'/"/g'
sed -f ss.sed helloword.sh
报错:
sed:文件 ss.sed 行号::未知的命令:“'”
sed -e "s/^'//g" -e "s/'$//g" ss.sed
,$ s/'/"/g
这样就可以了。
但是
sed -e "/^'/d" -e "/'$/d" ss.sed
没反应?????
看过参考之后,发现sed中d是对整个行起作用的,所以就把那一行删掉了,当然没反应了啊
cat sssss.sed
s#/#\#g
sed "s/\\\\/\\\\\\\\/g" sssss.sed
s#/#\\#g
不知道你领悟没呢,其实在命令行中用sed的s代替,要转义两次,一次是终端的转义,一次是sed本身的转义;
参考一:
Sed使用的变量里含有转义字符的解决
最近写脚本的时候碰到了这方面的问题,到网上搜了半天也没找到好一点的方案或总结。今天我把自己的摸索写一下。
首先是Sed里使用变量的问题
网上有人总结了四种方案:
1. eval sed 's/$a/$b/' filename
2. sed "s/$a/$b/" filename
3. .sed 's/'$a'/'$b'/' filename
4. .sed s/$a/$b/ filename
我比较喜欢第二种,也就是:Sed后面的表达式一般用单引号引起来('),当需要使用变量时就换用双引号(")。
关于单双引号的区别:
单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。
双引号:shell处理命令时,要对其中的内容进行算术扩展。如果想让shell扩展后得到sed命令所要的格式,使用命令:sed -n "/\\\\$/p" haha,扩展后得到的结果即\\$.
因此对于语句类似:
$Comfilename="/home/evan/sandbox/Main/"
1. echo $Comfilename | sed 's#\/#\\\/#g'
2. echo $Comfilename | sed "s#\/#\\\/#g"
第一个的结果是:\/home\/evan\/sandbox\/Main\/
而第二个还是:/home/evan/sandbox/Main/ 因为双引号会将“\/“解释为”/“,所以sed "s#\/#\\\/#g"被Shell解释成了sed s#/#\/#g 到sed里执行时又把”\/“转义为”/“了,这样相当于进行了了两次解释,就得不到想要的结果了。
这个例子告诉我当没必要用双引号的的时候就不要用,要不然说不定什么时候你就会很郁闷。当然单引号效率要比双引号高也是不要滥用双引号的原因之一。
言归正传,如何在sed的变量里使用那些特殊的需要转义的字符呢?
网上提出的一种方法是将sed里表示替换用的s后面的表示分隔用的字符换成别的变量里没有的字符这样就相当于变量里没有要转义的字符了。
如:
sed –i "s# $Comfilename#/Root/#" filename.list
这是一个好办法。但很不幸我需要的是删除“d”不是替换“s“。当我把同样的方法用于删除时似乎没有起到作用:sed –i "# $Comfilename#d" filename.list
于是只能自己手工先改写变量
$Comfilename="/home/evan/sandbox/Main/"
Tempname=` echo $Comfilename | sed 's#\/#\\\/#g'` (这里把反单引号执行的结果给临时变量,同样的方法可以改写其他需要转义的符号。)
sed –i "# $ Tempname #d" filename.list
个人感觉这种方法不是很好,但在网上找了半天也没找到更好的方法,只能感叹SHELL的博大精深,吾辈还得慢慢求索。
参考二:
在使用sed对日志或者其它文本进行parse的过程当中,有时候我们需要引用外部变量的值,
或者获取一个shell命令执行的结果,以便达到更加可观的输出结果。这里介绍如何做到。
sed中使用变量替换
1.sed命令使用双引号的情况下,使用$var直接引用
$ echo|sed "s/^/$RANDOM.rmvb_/g"
29328.rmvb_
# 上面例子引用了一个环境变量$RANDOM的值
2.sed命令使用单引号的情况下,使用'"$var"'引用
类似,我们可以看到
$ echo|sed 's/^/'"$RANDOM"'.rmvb_/g'
31338.rmvb_
sed中执行外部命令
1.sed命令使用单引号的情况下使用'`shell command`'或者'$(shell command)'引用命令执行的结果
还是以上面案例分析,例子如下
$ echo|sed 's/^/'`echo $RANDOM`'.rmvb_/g'
8063.rmvb_
# 上面的例子使用了旧式的命令替换,也可以采用新式的命令替换方法,如下
$ echo|sed 's/^/'$(echo $RANDOM)'.rmvb_/g'
18554.rmvb_
# 下面例子取用当前日期作为结果的一部分,如下
$ echo|sed 's/^/'$(date +"%Y%m%d")'.rmvb_/g'
20120108.rmvb_
2.sed命令使用双引号的情况下直接`shell command`或者$(shell command)引用命令执行的结果
类似的,双引号的情况,如下
$ echo|sed "s/^/$(date +"%Y%m%d").rmvb_/g"
20120108.rmvb_
# 使用环境变量$RANDOM以及旧式命令替换的例子
$ echo|sed "s/^/`echo $RANDOM`.rmvb_/g"
4988.rmvb_
总结
在sed语句里面,变量替换或者执行shell命令,双引号比单引号少绕一些弯子
linux中sed中用s 替换中遇到的问题的更多相关文章
- Linux下sed找出IP中第四位
ip addr|sed -n '9p'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -nr 's#^.*inet (.*) b ...
- VS2010中的查找和替换中正则的使用
只是记下来怕以后忘记了: 查找:/news/(\d+).html 要匹配(\d+),记得用括号 替换为:/NewsDetails.aspx?id=$1 $1表示匹配的结果
- Linux中sed的用法实践
Linux中sed的用法实践 参考资料:https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html http://www.fn139 ...
- Linux中Sed的用法
Linux中Sed的用法 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: ...
- [转帖]Linux教程(14)- Linux中的查找和替换
Linux教程(14)- Linux中的查找和替换 2018-08-22 07:03:58 钱婷婷 阅读数 46更多 分类专栏: Linux教程与操作 Linux教程与使用 版权声明:本文为博主原 ...
- linux中sed命令(全面解析)
目录 一:linux中sed命令介绍 1.sed作用 2.sed命令格式 3.参数 4.sed的编辑模式 5.sed参数解析用法 二:sed 参数 -f 案例实战解析 1.前介 2.引入简介 3.方法 ...
- linux中sed的用法【转】
sed命令行格式为: sed [-nefri] ‘command’ 输入文本/文件 常用选项: -n∶取消默认的输出,使用安静(silent)模式.在一般 sed 的 ...
- linux中sed用法
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
- [转载]linux中sed的用法
转自:http://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html sed命令行格式为: sed [-nefri] ‘ ...
随机推荐
- 自己搭建一个记笔记的环境记录(leanote)
一直在找一个开源的记笔记的软件,偶然看到leanote.竟然还是开源的,还是国人开发的果断mark了.自己在电脑上搭建了一个挺好玩的.可以记录一些不给别人看的小秘密. 下面是步骤记录,当然可以到官网上 ...
- [oldboy-django][2深入django]MVC&MTV
# MVC和MTV MVC = models(数据库) + views(模板html) + controllers(业务逻辑处理) MTV = models(数据库) + template(模板htm ...
- PAT1023
给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是1001555 ...
- 第一个Maven案例Hello Maven
Maven目录结构 src:程序源代码 -main -java:java代码 -package:自定义的包 ...
- POJ 2184:Cow Exhibition(01背包变形)
题意:有n个奶牛,每个奶牛有一个smart值和一个fun值,可能为正也可能为负,要求选出n只奶牛使他们smart值的和s与fun值得和f都非负,且s+f值要求最大. 分析: 一道很好的背包DP题,我们 ...
- [NOI2009] 植物大战僵尸 [网络流]
题面: 传送门 思路: 这道题明显可以看出来有依赖关系 那么根据依赖(保护)关系建图:如果a保护b则连边(a,b) 这样,首先所有在环上的植物都吃不到,被它们间接保护的也吃不到 把这些植物去除以后,剩 ...
- BZOJ 3509 [CodeChef] COUNTARI ——分块 FFT
分块大法好. 块内暴力,块外FFT. 弃疗了,抄SX队长$silvernebula$的代码 #include <map> #include <cmath> #include & ...
- 购物(sum)
购物(sum) 题目描述 visit_world 有一个商店,商店里卖N个商品,第ii 个的价格为 a[[i] 我们称一个正整数K 是美妙的,当且仅当我们可以在商店里选购若干个商品,使得价格之和落在区 ...
- 【CCF】JSON查询
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
- Linux SCRT本地免秘钥登录远程机器
一.生成本地公钥和私钥 1.1.创建公钥 步骤:工具->创建公钥 然后下一步: 秘钥类型选择RSA: 然后下一步: 密钥位长度:默认是1024,我这边是2048 然后下一步: 密钥格式: 然后点 ...