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] ‘ ...
随机推荐
- Mybatis通过接口的方式实现增删改查
导入jar包 [mybatis] [oracle] 生成数据库 1.添加Mybatis的配置文件mybatis-config.xml 在src目录下创建一个mybatis-config.xml文件,如 ...
- BZOJ 1564 :[NOI2009]二叉查找树(树型DP)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
- AGC 26 D Histogram Coloring
题目 将柱子的高度离散化$\DeclareMathOperator{\dp}{dp}$ 设第 $i$ 根柱子实际高度是 $h_i$,离散化之后的高度是 $g_i$:第 $i$ 高的高度是 $H_i$, ...
- POJ 3481 Double Queue(Treap模板题)
Double Queue Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15786 Accepted: 6998 Des ...
- [WC2013][luogu4074] 糖果公园 [树上带修改莫队]
题面: 传送门 思路: 一道实现起来细节比较恶心的题目 但是其实就是一个裸的树上带修改莫队 好像树上莫队也出不了什么结合题目,不像序列莫队天天结合AC自动机.后缀数组...... 莫队学习请戳这里:莫 ...
- linux系统——机制与策略(二)
策略与机制 大部分策略与机制的区别定义是,策略是描述如何实现什么功能,机制则是需要实现怎样的功能.在"The Art of Unix Programming" 中Raymond通过 ...
- 安装淘宝内核LVS
具体安装方法按照淘宝twiki来:http://kernel.taobao.org/index.php?title=Documents/Kernel_build. 但是有些问题是要注意的: 1. 修改 ...
- jmeter作接口测试入门的简单使用说明
一.添加接口信息 1.添加线程组 (1)路径如下图: (2)部分内容解释 a. Number of Threads(users):线程数 b. Ramp-Up Period(in seconds) ...
- pat 团体天梯 L1-046. 整除光棍
L1-046. 整除光棍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 翁恺 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1 ...
- 【HDOJ5538】House Building(计算几何)
题意:给定一个n*m的方阵,第i行第j列的高度为a[i][j],问除了下底面之外其余五面的总表面积 n<=50,0<=a[i][j]<=1000 思路:队友写的,抱大腿 考虑当前方格 ...