日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell 删除奇数偶数行

發布時間:2024/4/17 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell 删除奇数偶数行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天總結一個正則的東西匹配和替換的刪除奇數行和偶數行來理解模式空間以及模式空間是如何保存、標記數據的

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

其實這是用了一種替換命令即/ab/a/g

g/.*$/+1d 刪除偶數行

g/.*$/d|m 這個也可以涉及到了替換、模式空間標記,

刪除偶數行的方法如下:

?

1

:g/^/+1 d

上面用到了:gbobal命令,gbobal命令格式如下:

?

1

:[range]global/{pattern}/{command}

global命令實際上是分成兩步執行:首先掃描[range]指定范圍內的所有行,給匹配{pattern}的行打上標記;然后依次對打有標記的行執行{command}命令,如果被標記的行在對之前匹配行的命令操作中被刪除、移動或合并,則其標記自動消失,而不對該行執行{command}命令。{command}可以是一個ex命令,也可以是用|分隔的多個ex命令,這樣我們就可以對被標記行,或從標記行尋址到的行進行多種不同的操作。

上面刪除偶數行的命令,先匹配所有行,然后隔行刪除(其中+1用以定位于當前行的下一行)。為什么是隔行呢?因為在對第一行執行+1 d命令時刪除的是第二行,而第二行雖然也被標記了,但已不存在了,因此不會執行刪除第三行的命令。

刪除幾數行的命令如下:

?

1

:g/^/d|m

其中m的作用是移出偶數行的標記,防止偶數行也被刪除。

另外刪除幾數行偶數行,也可以用normal命令,分別為(第一個命令為幾數行):

?

1

2

:%norm jkdd

:%norm jdd



%s/\(^.*$\)\n^.*$/\1/g ? ? ?vi 替換命令誰能幫忙講一下

全局替換所有去掉特殊符號

\( \) ? 是所有內容
^ ?改行開頭
^. 開行開頭的第一個字符
* 后面跟的字符?
$ 換行
\n 換行
\1 ?這個不知道啥意思...


\1 是不 是代表第一個保存的字符串啊?

不會....?

這個正則的功能是隔行刪除...?

咋實現的 ?我不知道?

悠悠巷口 10:19:33?
\n^.*$/ 這個看不懂?

每行開頭
有點得字符
至結尾?

那它還用\n什么作用?



.不是代表有點的字符...
點是通配符..

%s/\(^.*$\)\n^.*$/\1/g?? ? ?vi 替換命令誰能幫忙講一下
%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=/\(.*\) ? ???抽取出來實際上是\(...\),表示正則表達式
分組,再分析括號內的?.*,表示匹配任意零個或多個字符 ( 除換行符 )?

B=\(.\)$ ? ? ?括號內的?. ,表示匹配 任意字符 ( 除換行符
) ,括號外的$表示匹配到行尾,即表示行尾的最后一個字符;那上述的A /\(.*\) ?就表示該行最后一個字符前的所有字符。

于是?sed?'s/\(.*\)\(.\)$/\2/'
作用就是:刪除該行最后一個字符外的所有字符,保留最后一個字符,也即取得該行最后一個字符。
?
把語法的地方去掉??看具體內容

\(??^.?*?$??\)??\n?^.*$
匹配整個文本\(\)
開頭位置字符匹配至結尾?匹配內容為第一個字符0個或者N個?制止改行結束???之后勛章換行符??再之后匹配開頭的第一個字符到結束?刪除一行.?


轉載于:https://blog.51cto.com/aklaus/1763595

總結

以上是生活随笔為你收集整理的shell 删除奇数偶数行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。