免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1293 | 回复: 4

[文本处理] sed中{//}的问题,请帮忙解惑。谢谢 [复制链接]

论坛徽章:
5
天秤座
日期:2015-04-08 20:28:42辰龙
日期:2015-04-08 20:35:06寅虎
日期:2015-04-08 20:35:56子鼠
日期:2015-04-08 20:36:192015亚冠之迪拜阿赫利
日期:2015-05-13 16:52:25
发表于 2015-05-13 17:21 |显示全部楼层
本帖最后由 ywmkelly 于 2015-05-13 17:22 编辑
  1. sed -n '/c/,${//!p}' file
复制代码
这个命令的解释,匹配字符c那行开始,到末尾行(末尾行用$表示,行与行的区间要用,)。中括号中做单独命令处理。
//在这里表示重复上个命令的意思,!p表示不打印匹配行、
假如file 为
a
b
c
d
e
则上面那条语句输出为
d
e

Q:问题我都不明白出在哪,我就把我的想法写下来吧。
我知道
  1. [root@localhost TEST]# sed -n '/c/,$!p' file
  2. a
  3. b
复制代码
这个我能理解。
  1. [root@localhost TEST]# sed -n '/c/,$p' file
  2. c
  3. d
  4. e
复制代码
这个应该是{}前面的那段的执行结果。

如果往最终输出结果上去揣摩,应该是对
c
d
e
这个结果再执行
  1. sed -n '/c/,$!p' file
复制代码
那不是什么都没剩下吗?

我哪里理解出错了呢?


==========
另一个贴中,dengwei29 对
  1. sed  '/PATSET/,/LINKSET/{//!d;n}' file.txt
复制代码
的解释是
  1. sed '/PATSET/,/LINKSET/{/PATSET\|LINKSET/!d;n}' file
复制代码
我想问 dengwei29  为何不是
  1. sed '/PATSET/,/LINKSET/{/PATSET/,/LINKSET/!d;n}' file
复制代码

论坛徽章:
5
天秤座
日期:2015-04-08 20:28:42辰龙
日期:2015-04-08 20:35:06寅虎
日期:2015-04-08 20:35:56子鼠
日期:2015-04-08 20:36:192015亚冠之迪拜阿赫利
日期:2015-05-13 16:52:25
发表于 2015-05-13 17:23 |显示全部楼层
dengwei29

怎么@人啊  

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
发表于 2015-05-13 17:36 |显示全部楼层

a
b
c
d
e
  1. sed -n '/c/,${//!p}' file
复制代码
// 表示使用前面正则表达式去进行匹配

/c/, 这里的正则是去匹配c, 当读入c那一行时, /c/,$ ,开启模式为真, 则执行大括号里的命令, 即执行 //!p,  此时这里// 等价于 /c/!p, 所以此时/c/!p, 所以 c 这一行不打印

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
发表于 2015-05-13 17:39 |显示全部楼层
我上面说的可能不太准确, 去看看 info sed, 有这么一句:
  1. The empty regular expression ‘//’ repeats the last regular expression match (the same holds if the empty regular expression is passed to the s command). Note that modifiers to regular expressions are evaluated when the regular expression is compiled, thus it is invalid to specify them together with the empty regular expression.
复制代码

论坛徽章:
0
发表于 2015-05-14 16:59 |显示全部楼层
如果往最终输出结果上去揣摩,应该是对
c
d
e
这个结果再执行
sed -n '/c/,$!p' file
那不是什么都没剩下吗?


----------------------------------------
'/c/,${//!p}'中的//,并不是指'/c/,$',而是上一个匹配模式,也就是'/c/'。对结果
c
d
e
执行sed -n '/c/!p' file

----------------------------------------
比如
seq 1 9 |sed '/3/,/6/s///'
1
2

4
5

7
8
9
这里//匹配的是/3/和/6/,并不是/3/,/6/。

----------------------------------------
sed -n '/c/,${//!p}' file 命令中的//。说得直白一点,//可以简单理解/c/简写形式,用//或/c/结果都是一样。

以上是我对//的理解,若有不对的地方,请大神指正。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP