日期:2014-05-16  浏览次数:20604 次

正则表达式 linux shell 删除偶数奇数行 取得最后一个字符 s/\(^.*$\)\n^.*$/\1/g

删除偶数行:
%s/\(^.*$\)\n^.*$/\1/g
删除奇数行:
%s/^.*$\n\(^.*$\)/\1/g

?

?

解释:
?
正则表达式预备知识
注意到,对于正则表达式有
匹配 任意字符 ( 除换行符 ) .
匹配重复零次或多次前一字符 *
匹配集合中任意字符 [...]
匹配不属集合 中 任意字符 [^...]
匹配 行首、行尾 ^, $
匹配 词首、词尾 \<, \>
正则表达式 分组 \(...\)
第 n 个分组内容 \n
?
于是
\1 表示第一个正则表达式分组即\(^.*$\) 我们暂将第一个正则表达式分组\(^.*$\)其记为:A
类推,\2就应该表示第二个正则表达式分组,即?\n^.*$ ?实际上 也应该写在括号内比较好:\(\n^.*$\) ,我们也暂将第二个正则表达式分组?\n^.*$ 记为:B
于是
%s/\(^.*$\)\n^.*$/\1/g
就可以写为:
%s/AB/A/g 即将所有AB都替换成A。
现在我们来分别分析A和B的作用。
A=\(^.*$\) ? ? 抽取出来实际上是\(...\),表示正则表达式 分组,再分析括号内的^.*$,^代表行首, .匹配 任意字符 ( 除换行符 ) ,?*匹配重复零次或多次前一字符 ,??$代表匹配到行尾,综合起来就是:匹配这一行
B=\n^.*$ ? ? ?解释:?\n换行,^.*$同上,表示匹配这一行,综合起来就是:下一行(即上行结束后开始的另一行)。
再于是就有:%s/AB/A/g 即将所有AB都替换成B ?,代入A和B各自意思得到:
将两行(如行1和行2 )内容替换为第一行内容(即行1的内容),加上/g,就是对全文进行前述替换,也就是隔行删除,如果是从文件第一行开始进行的操作,就意味着是删除所有偶数行、保留所有奇数行操作。
?
删除偶数行:
%s/\(^.*$\)\n^.*$/\1/g
删除奇数行:
%s/^.*$\n\(^.*$\)/\1/g

?
补充另一例子:?sed?'s/\(.*\)\(.\)$/\2/'
\2就应该表示第二个正则表达式分组
同上,也将A=/\(.*\),B=\(.\)$,表达式变为's/AB/B',将AB都替换成B?
分析A、B作用。
A=/\(.*\) ? ???抽取出来实际上是\(...\),表示