+ -
当前位置:首页 → 问答吧 → 大家好,我是一新手,来问一个sed的问题。。。

大家好,我是一新手,来问一个sed的问题。。。

时间:2011-01-27

来源:互联网

删除结尾的空行的脚本是:
sed '{
:start
/^\n*$/{ $d; N; b start }
}'
但是替换内容里面的\n能被检查到吗?因为最先开始sed读取一行文本,这行文本是不含\n的。
如果能够查到,那么为什么以下的脚本不能成功呢:
$cat data
this is the first line.

line
line

this is the end line.
$sed -n '/^line\nline$/p' data
$  #没有输出

作者: logic_pn   发布时间: 2011-01-27

谢谢了,我被这问题困扰的焦头烂额的,大家不要不理我阿

作者: logic_pn   发布时间: 2011-01-27

本帖最后由 blackold 于 2011-01-27 12:56 编辑

回复 logic_pn


    \n*也匹配空。

   建议你先看正则基础。


多行模式空间才会有\n,常见的是单行模式空间,没有\n。

作者: blackold   发布时间: 2011-01-27

sed是一行一行处理的  ^line\nline$ 这样是死活都匹配不到的

作者: lkk2003rty   发布时间: 2011-01-27

但是最开始的时候是单行模式的呀,那么/^\n*$/{ $d; N; b start }大括号里面的命令怎么有机会执行呢?怎么从单行模式转换成多行模式的呢?

作者: logic_pn   发布时间: 2011-01-27

回复 logic_pn


    首先你要搞清楚/^\n*$/这个正则是什么东西。

    估计你也不看前面的回帖。
   

   /^\n*$/匹配行首,后接0个或多个\n,后接行尾。换句话说,/^\n*$/会匹配一个或多个连续"真"空行。


   如果输入文件有空行,就匹配了。

作者: blackold   发布时间: 2011-01-27

我不太聪明。。。。其实我看了的
有点不明白这个问题:
比如/^\n$/这个(先去掉*),至少在pattern space 里面有个\n才能匹配到吧
但是最开始是单行模式,没有\n,\n是至少在一个N命令后才能插入pattern space 里面的
那么第一次是如何匹配到的呢?

作者: logic_pn   发布时间: 2011-01-27

回复 logic_pn


    去掉*就不会匹配到了。


    你怎么知道它可以匹配到?

作者: blackold   发布时间: 2011-01-27

回复 logic_pn


    第一次就是因为有那个 *  在所以才匹配到的

作者: lkk2003rty   发布时间: 2011-01-27

的确配不到了。。。。
那为什么\n*就可以配到,\n就不行?一个匹配不到,很多该从何谈起?
这个是不是一种特殊用法阿?

作者: logic_pn   发布时间: 2011-01-27

我懂了!因为*可以代表0个!谢谢你们了!

作者: logic_pn   发布时间: 2011-01-27

热门下载

更多