今晚对照sed简明教程1(http://qujunorz.blog.51cto.com/6378776/1379881),学习了一小会SED。


总结以下:

1、首先搞懂特殊字符:

  • ^ 表示一行的开头。如:/^#/ 以#开头的匹配。

  • $ 表示一行的结尾。如:/}$/ 以}结尾的匹配。

  • \< 表示词首。 如 \<abc 表示以 abc 为首的詞。

  • \> 表示词尾。 如 abc\> 表示以 abc 結尾的詞。

  • . 表示任何单个字符。

  • * 表示某个字符出现了0次或多次。

  • [ ] 字符集合。 如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示反,如[^a]表示非a的字符

注:sed和正则的关系很密切,很多正则的匹配都可以使用。


2、sed的格式可分解为:


sed " 操作内容"  文件名 OR  sed  '操作内容' 文件名(即操作内容可以用单引号或者双引号)

#sed "3,6s/my/your/g" pets.txt 或者 #sed  3,6s/my/your/g’ pets.txt


操作内容又分为:

‘ 第几行 命令参数 /内容/内容/第几列’

#sed "3,6s/my/your/g" pets.txt

  1、“3,6”即为第3行到第6行

  2、s命令表示替换作用

  3、 /my/your/即为将my替换成your

  4、/g 表示一行上的替换所有的匹配,如果是/3即表示替换第三个匹配到的字符。


注:貌似也有一些命令是加在内容后面的,如删除行参数/d


3、今晚最大收获应该是弄清楚了SED的圆括号匹配:\(.*\)


#sed's/This is my \([^,]*\),.*is \(.*\)/\1your\2/g'my.txt

首先 \([^,]*\) 这是代表一个区域的内容“\(” 符号前内容匹配成功,“\)”符号后内容匹配成功,"\( ""\)"中间这段的字符为一个区域,并将这个区域内容赋值给变量“\n”(n从1开始往后计算)。

以上的命令即可分解为:

正则为:This is my ([^,]*),.*is (.*)     #([^,]*)非逗号开头的任何内容,(.*)包含点开头的的任意字符。

my之后“,”之前的内容赋值给"\1"is之后的内容赋值给“\2”

然后将这个/This is my \([^,]*\),.*is \(.*\)/替换成 /\1your\2/


UPdate:2014/5/9

补充:sed的工作原理和格式

4.1Sed工作原理

sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。

下面我们看一下sed的工作过程。

sed不是在原输入上直接进行处理的,而是先将读入的行放到缓冲区中,对缓冲区里的内容进行处理,处理完毕后也不会写回原文件(除非用shell的输出重定向来保存结果),而是直接输出到屏幕上。sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sedsed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。

SED学习小结(1)_sed

一般情况下暂存缓冲区是用不到的,但有特殊的命令可以在模式空间与暂存缓冲区之间交换数据,后文将有介绍。由于sed对文本的所有操作都是在缓冲区里进行的,所以不会对原文件造成任何破坏。

4.2Sed命令格式

sed的命令格式如下:

sed [-Options] [‘Commands’] filename

其中,Command是一个sed命令,sed命令一定要被包含在一对单引号中,以免被shell解释,其格式如下:

[address-range][sed-command]

[Pattern-to-match][sed-command]

address-range是指要处理的行的范围,又叫地址范围;pattern-to-match是一个要匹配的模式,是一个正则表达式,sed-command是一个sed命令,用来对指定的行进行处理。

   其实[Pattern-to-match]也是对应缓冲区内的一段地址,即[address-range]