本文作为sed使用教程的最后一篇,将比较全面的讲解如何操作csv文件,csv文件通过逗号分隔
示例文件如下:
1.删除第一列
s开启替换模式,当^符号在中括号里的时候,就是非的意思,也就是说[^,]匹配了所有不是逗号的一个字符,然后后面的星号表示0个或多个,然后是一个逗号,也就是匹配"xxxx,“替换为空
2.删除除过最后一列的其他所有
sed先匹配任意多个字符,然后匹配最后一个“,”这就直接把前面的都匹配完了。替换为空即可。
3.输出第一列
好理解把,先匹配第一列之后的逗号,然后是多个字符,然后替换为空
4.删除第二列
先匹配第一列之后的逗号,然后匹配一个或多个非逗号字符,这样就匹配了第二列的内容,然后再匹配一个逗号,我简化一下,比如该列是1,2,3,4,那么这一个匹配就是”,2,",替换成一个逗号,就是1,3,4了
5.输出第二列
我们可以分析前两个斜线之间的内容
两个右斜线转移了括号,所以括号不是简单的符号,而是正则里的组的意义,圆括号的作用是对字符进行分组,并保存匹配的文本。这里先匹配非逗号的多个字符,然后一个逗号,然后再匹配第二列,并且第二列的匹配用括号括起来,然后匹配其他列,然后里面用\1来引用这个括号的内容,如果前面有两个括号,就可以使用\1或\2这样,分别表示第一个括号或第二个括号的匹配
6.输出最后一列是一位数字的行
.*匹配了前面的所有字符,然后,匹配了最后一个逗号,sed的贪婪原则。。然后[0-9]匹配一个数字$表示行尾.ok
7.给每一行自动添加行号
这个和cat -n file的效果是一样的。awk也可以很简单的做,这里使用一个=命令会在每一行之前添加一个行号,也就是是,如果执行
文件会是:
然后我们通过管道再执行
N表示读入并合并下一行,然后将两行之间的换行符替换为空即可了
8.如果第一列是Ubuntu,就把最后一列替换成99
中间的
匹配“Ubuntu,任意个字符,任意个字符”,也就是将行分成几组,将本行替换成第一组的内容第一组的内容,第二组的内容,但最后的一列被替换成99,就这样。
9.如果第一列是RedHat就删除第二列
也好理解嘛。将要保留的用括号分组,然后用\1和\2分别引用第一组和第二组,然后中间的匹配就被删除了
10.在末尾插入一列
正则首先匹配了整行字符,然后使用&来引用该匹配,然后添加了一个逗号和一个A
11.在头部添加一列
很简单不是么…
比预计的要快,两天翻译完了.体会到了理解原理对学习sed的好处,希望对想学的人有帮助.