正则表达式 linux shell 剔除偶数奇数行 取得最后一个字符 s/\(^$\)\n^$/\1/g
正则表达式 linux shell 删除偶数奇数行 取得最后一个字符 s/\(^.*$\)\n^.*$/\1/g删除偶数行:%s/\(^.*$\)\
正则表达式 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',将A
B都替换成B?。分析A、B作用。A=/\(.*\) ? ???抽取出来实际上是\(...\),表示正则表达式 分组,再分析括号内的?
.*,表示匹配任意零个或多个字符 ( 除换行符 )?B=\(.\)$ ? ? ?括号内的?. ,表示匹配 任意字符 ( 除换行符 ) ,括号外的
$表示匹配到行尾,即表示行尾的最后一个字符;那上述的A /\(.*\) ?就表示该行最后一个字符前的所有字符。于是?sed?'s/\(.*\)\(.\)$/\2/' 作用就是:删除该行
除最后一个字符外的所有字符,保留
最后一个字符,也即取得该行最后一个字符。
北京@王帅 10:23:37?
把语法的地方去掉??看具体内容
北京@王帅 10:25:18?
\(??^.?*?$??\)??\n?^.*$
匹配整个文本\(\)
开头位置字符匹配至结尾?匹配内容为第一个字符0个或者N个?制止改行结束???之后勋章换行符??再之后匹配开头的第一个字符到结束?删除一行.?
?