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 替换中遇到的问题的更多相关文章

  1. 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 ...

  2. VS2010中的查找和替换中正则的使用

    只是记下来怕以后忘记了: 查找:/news/(\d+).html 要匹配(\d+),记得用括号 替换为:/NewsDetails.aspx?id=$1 $1表示匹配的结果

  3. Linux中sed的用法实践

    Linux中sed的用法实践 参考资料:https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html http://www.fn139 ...

  4. Linux中Sed的用法

    Linux中Sed的用法 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: ...

  5. [转帖]Linux教程(14)- Linux中的查找和替换

    Linux教程(14)- Linux中的查找和替换 2018-08-22 07:03:58 钱婷婷 阅读数 46更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博主原 ...

  6. linux中sed命令(全面解析)

    目录 一:linux中sed命令介绍 1.sed作用 2.sed命令格式 3.参数 4.sed的编辑模式 5.sed参数解析用法 二:sed 参数 -f 案例实战解析 1.前介 2.引入简介 3.方法 ...

  7. linux中sed的用法【转】

    sed命令行格式为:         sed [-nefri]  ‘command’  输入文本/文件 常用选项:        -n∶取消默认的输出,使用安静(silent)模式.在一般 sed 的 ...

  8. linux中sed用法

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed ...

  9. [转载]linux中sed的用法

    转自:http://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html sed命令行格式为:         sed [-nefri]  ‘ ...

随机推荐

  1. 聊聊、RabbitMQ 第一篇

    (一)windows 下安装配置 开源的消息中间件有很多,各有各的优缺点,适合自己项目的才是最好的.首先下载 rabbitMQ 安装版本,因为 rabbitMQ 底层语言是 erlang,所以首先要先 ...

  2. imx6移植librtmp

    一.openssl交叉编译 1.下载 https://www.openssl.org/source/ 版本不要太高,刚开始版本高了,有些函数取消了,链接不上 使用1.0.1f即可 2.编译成共享库 . ...

  3. [问题解决]NotImplementedError 错误原因:子类没有实现父类要求一定要实现的接口

    NotImplementedError: 子类没有实现父类要求一定要实现的接口. 在面向对象编程中,父类中可以预留一个接口不实现,要求在子类中实现.如果一定要子类中实现该方法,可以使用raise No ...

  4. PAT1024

    科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...

  5. bzoj 4465 游戏中的学问(game)

    题目描述 输入 输出 样例输入 3 1 1000000009 样例输出 2 提示 solution 令f[i][j]表示i个人围成j个圈的方案数 啥意思呢 可以把一个人塞进前面的圈里(i-1种塞法) ...

  6. ionic2 使用slides制作滑动效果的类型选择栏

    类似的效果如下图: 1. 生成一个component ionic g component MySlide 2. 在my-slide.html中添加代码: <ion-slides class=&q ...

  7. ionic2如何调用百度地图

    使用ionic2接入百度地图 在index.html中引入百度地图的js类库 <script type="text/javascript" src="http:// ...

  8. vue的roter使用

    1在src下建立router文件夹,再建立router.js import Vue from 'vue' import Router from 'vue-router' import home fro ...

  9. PE

    不是projecteuler,我想说的是projecteuclid..似乎是一个有很多数学文献的网站..? PE541似乎是一道很有趣的题目,有一个暴力大概就是首先转化一下模型变成找\(\sum_{x ...

  10. 模板jinja2常用方法

    http://docs.jinkan.org/docs/jinja2/ 摘自 http://www.pythontip.com/blog/post/5455/ 数学运算       +, -, *,  ...