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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

15.正则表达式扩展正则字符处理

發(fā)布時間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 15.正则表达式扩展正则字符处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

📋 個人簡介
💖 作者簡介:大家好,我是小鵬linux,運維領(lǐng)域新星創(chuàng)作者,阿里云ACE認證高級工程師😜
📝 個人主頁:小鵬linux🔥
🎉 支持我:點贊👍+收藏??+留言📝
💬格言:你未必出類拔萃,但一定與眾不同!🔥
📕 系列專欄:
? ? ? ? ? ? ? ?🍎 階段一:windows基礎(chǔ) ? ? ? ? ? ? ? ? ? ? ? ?目前原創(chuàng)16篇
? ? ? ? ? ? ? ?🍎 階段二:Linux基礎(chǔ)知識 ? ? ? ? ? ? ? ? ? ? ?目前原創(chuàng)38篇
? ? ? ? ? ? ? ?🍎 階段三:shell基礎(chǔ)+shell高級 ? ? ? ? ? ? ?目前原創(chuàng)15篇
? ? ? ? ? ? ? ?🍎 階段四:python基礎(chǔ)及自動化應(yīng)用 ? ? ?原創(chuàng)未開始
? ? ? ? ? ? ? ?🍎 階段五:Linux網(wǎng)絡(luò)服務(wù) ? ? ? ? ? ? ? ? ? ? ? 原創(chuàng)未開始
? ? ? ? ? ? ? ?🍎 階段六:集群原理及架構(gòu) ? ? ? ? ? ? ? ? ? ? 原創(chuàng)未開始
? ? ? ? ? ? ? ?🍎 階段七:云計算虛擬化技術(shù) ? ? ? ? ? ? ? ? 原創(chuàng)未開始

???????

?

目錄

1.正則表達式:

2.保留字

3.&&:與運算符

4.| | :或運算

5.字符處理

6.擴展正則表達式


1.正則表達式:

因為系統(tǒng)中會產(chǎn)生很多信息,有些信息很重要,有些信息卻沒那么重要。這就需要某個功能來對信息過濾,找到有用的關(guān)鍵信息。

1.1概述:正則表達式用來在文件中匹配符合條件的字符串,通配符用來匹配符合條件的文件名。其實這種區(qū)別只在shell中適用, 因為用來在文件當(dāng)中搜索字符串的命令,如grep、awk、sed等命令可以支持正則表達式,而在系統(tǒng)當(dāng)中搜索文件的命令, 如:ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符來進行匹配了。

正則表達式即是規(guī)范字符的書寫格式,是使用特殊符號,實現(xiàn)文字、字符格式上的規(guī)定。

如:郵箱的書寫格式為:XXXX@XXXX.XXX,此格式即為郵箱地址的正則表達式。

1.2基礎(chǔ)正則表達式

元字符

作用

.

匹配除換行符以外的任意一個字符

*

前一個字符匹配0或任意多次

^

匹配行首。例:^hello會匹配以hello開頭的行

$

匹配行尾。例:hello$會匹配以hello結(jié)尾的行

[]

匹配中括號中指定的任意一個字符,只匹配一個字符。例:[aeiou]匹配任意一個元音字母。[0-9]會匹配任意一位數(shù)字。[a-z][0-9]匹配小寫字和一位數(shù)字構(gòu)成的兩位字符

[^]

匹配除中括號的字符以外的任意一個字符。例:[^0-9]匹配任意一位非數(shù)字字符

\

轉(zhuǎn)義符。用于取消,將特殊符號的含義取消

\{n\}

表示其前面一個字符恰好出現(xiàn)n次。例:[0-9]\{4\} 匹配4位數(shù)字。[1][3-8][0-9]\{9\}匹配手機號

\{n,\}

表示其前面一個字符出現(xiàn)不小于n次。例:[0-9]\{2,\}匹配2位及以上的數(shù)字

\{n,m\}

表示前面的一個字符至少出現(xiàn)n次,最多出現(xiàn)m次。例:[a-z]\{6,8\}匹配6-8位的小寫字母

\符號:

我們之前了解到.*代表的是任意長度的不包含換行的重復(fù)字符。但是如果想匹配任意長度.的時候。就需要用到\了。

\<符號和\>符號:

這兩個符號分別用于界定左邊界和右邊界。比如\<hello\>用來精確匹 配hello這個字符串。

2.保留字

Linux中,有很多的特殊符號,可以幫助我們進行正則表達式的制定,具體常用符號如下:

*---通配符,表示任意長度的任意字符,如:rm -rf /mnt/ff*
?---單配符,表示一位長度的任意字符
[ ]---單個字符的取值范圍,如: [0-9] [02468] [a-z] [A-Z]
{ }多字符的取值范圍,如{ab,bc,cd}
" "主用于明確命令參數(shù)的范圍,如:date +"20%y-%m-%d%H:%M:%S"
' '多用于引號嵌套時使用,如:echo 'i say :"hello"'
``反單引,所引起來的內(nèi)容,先當(dāng)做命令執(zhí)行,再把執(zhí)行結(jié)果交給其他命令使用。如:echo "the time is :date"
$變量值提取功能 用戶身份標(biāo)識符
\轉(zhuǎn)義字符,提取后邊符號的引申含義, 如:PS1="[\u@\h \W]\$"
|管道符,格式:前后兩個命令,前命令的結(jié)果交給后命令當(dāng)做輸入信息使用。如:ll /etc
&后臺執(zhí)行符, 在命令后面加上&后,該命令將被放入到后臺執(zhí)行, 如:find / -name f1 &jobs ---查看后臺進程
&&命令連接、順序執(zhí)行,如:echo aaaaa && echo bbbbb ,要求:必須每個命令都正確執(zhí)行
| |多個命令連接,前命令執(zhí)行失敗,才會去執(zhí)行后命令,如: cat f1 | | echo bbbbb
>輸出重定向,格式:前命令,后文檔,功能:把前命令的運行結(jié)果,當(dāng)做文字保存到文檔中。如:ls -l /var > /mnt/f1
<輸入重定向,格式:前命令,后文檔,功能:把后文檔的文字內(nèi)容,當(dāng)做前命令的輸入信息使用,如:write zhang < /mnt/f1 mail zhang < /mnt/f1

關(guān)于以上各符號的案例中使用的命令,下面來做一下分析、介紹:

3.&&:與運算符

功能:兩個條件必須都滿足,結(jié)果才是成立的;

如:A 與 B 到校上課

來來=成立
沒來=不成立
沒來=不成立
沒來沒來=不成立

分析:當(dāng)A條件滿足時,B條件才有審查的必要;但是當(dāng)A條件不滿足時,無論B條件是否滿足,結(jié)果都是不成立的,則B條件就不會被審核了。所以,對應(yīng) cat f1 && echo bbb,若f1文件不存在,cat命令執(zhí)行失敗,則后面echo bbb的命令將不再執(zhí)行。

4.| | :或運算

功能:兩個條件至少一個是滿足的,結(jié)果就是成立的

例:A 或 B 到校上課

來來=成立
沒來=成立
沒來=成立
沒來沒來=不成立

分析:當(dāng)A條件滿足時,無論B條件是否滿足,結(jié)果都是成立的,則B條件

就不會被審核了。只有當(dāng)A條件不滿足時,B條件才有審查的必要。

所以,對應(yīng) cat f1 && echo bbb,若f1文件不存在,cat命令

執(zhí)行失敗,則后面echo bbb的命令才會執(zhí)行。若cat f1執(zhí)行成功,

則后面的echo bbb將不再執(zhí)行。

5.字符處理

Linux中對于文檔中文字、字符的處理也有很多細節(jié)操作的命令,具體如下:

5.1 head、tail命令

head -n 3 f1 ---顯示文檔的前3行

head -n -3 f1 ---排除文檔的最后3行,顯示前面的文字

tail -n 3 f1 ---顯示文檔的最后3行

tail -n +3 f1 ---從第3行開始顯示到結(jié)尾

對于head –n -3 和tail –n +3 的行數(shù)控制,其原理是文檔中每行文字的讀取都借助與文檔內(nèi)部的行指針操作,指針指向哪一行,就會讀取哪一行。但是當(dāng)文件讀取前,指針是指向第一行之前的空處,所以只有指針下移一行,才會讀取到第一行的文字,因此tail –n +3 實質(zhì)是讓指針下移三次,開始讀取,所以才會讀取到第三行的文字;而head–n -3是避除指針可到的最后三行,所以是不讀取倒數(shù)第三行的。

命令組合應(yīng)用:tail -n +3 f1 | head -n 3 ---顯示3-5行

5.2 grep抓取命令

grep命令可以從文檔中抓取顯示包含指定字符的行,在日常使用中比較常用。

grep "name" f1 ---抓取f1中包含name的行

grep -n "name" f1 --- -n表示結(jié)果中顯示行號

grep -i "name" f1 --- -i 表示忽略大小寫

grep -v "name" f1 --- -v 顯示不包含指定字符的行

grep "^name" f1 --- "^name" 以指定字符開頭的行

grep "name$" f1 --- "name$" 以指定字符結(jié)尾的行

活用:grep "^name$" f1 ---抓取顯示一行僅有name字符的行

grep -n "^$" f1 ---抓取顯示空行及其行號

ll /etc | grep "^d" | less ---顯示/etc/所有目錄。

注: ll后目錄文件的第一個字符顯示為d

5.3 wc統(tǒng)計命令

wc命令是對文檔文字做統(tǒng)計功能的,最常用的是行數(shù)上的統(tǒng)計。

wc -l f1 --- -l 統(tǒng)計文檔中有幾行文字

其他參數(shù): -c 字節(jié)數(shù) -m 字符數(shù) -w單詞數(shù) -L 最長行的長度

活用:ll /etc | grep "^d" | wc -l ---統(tǒng)計/etc/下目錄的個數(shù)

注:ll后一個文件顯示為一行,所以統(tǒng)計行數(shù)即為統(tǒng)計目錄數(shù)

5.4 sort 排序顯示

sort命令用于對顯示內(nèi)容的排序處理。

sort -rn -k 2 f2 ---按照文檔的第二列的數(shù)值大小,降序(即大->

小)排序顯示,-r 降序,不寫默認升序 -n

按照數(shù)值大小比較排序 -k 指定按照第幾列

排序

sort -rn -u -k 2 f2 --- -u表示去除重復(fù)行

sort -t ":" -rn -k 2 f2 --- -t 指定列之間的分隔符,不寫,默

認空格作為分隔符

5.5 cut命令

cut命令,截取指定列顯示

cut -d " " -f 3 f1 ---截取文檔中的第3列, -d 指定分隔符

-f 指定顯示第幾列

但是,cut命令對分隔符連續(xù)較多的情況,審核較為死板,很難按照我們想要的效果實現(xiàn)截取,如有以下文件:

aaa 111 AAA

bbb 222 BBB

則每行文字中各列間的空格數(shù)不同,在用cut時,是用第一個空格作為分隔符,第二個空格則被視為第二列,一次類推,因此,在截取指定列時十分不便。所以一般在連續(xù)分隔符個數(shù)不統(tǒng)一時,我們更習(xí)慣使用awk命令。

5.6 awk命令

awk命令功能十分強大,可根據(jù)需要抓取、截取指定的列或行。具體如下:

awk -F" " '{print $2,$3}' f1 ---截取顯示文檔的第2、第3列,-F 指

定分隔符, $2,$3表示顯示第幾列

awk -F" " '($2>300){print $2,$3}' f1

--- 第二列的值大于300的行,顯示其第2、第3列,()中指定篩選條件

awk 'NR==4 || NR==3' f1 ---顯示第3和第4行, NR表示行號

awk '/data/ {print $2}' f1 ---抓取包含指定字符的行,再進行截取列

awk '$4 ~ /data/ ' f1 ---抓取第4列包含指定字符的行

awk '$4 !~ /data/ ' f1 ---抓取第4列不包含指定字符的行

5.7 sed命令

sed命令是一個十分復(fù)雜的文字處理命令,其中有很多的參數(shù)和格式,但可以實現(xiàn)幾乎所有的字符處理需求,常用的幾個參數(shù)如下

sed '1,3d' f1 ---不顯示第1-第3行, 1,$可表示1-文件尾

sed '/data/d' f1 ---不顯示包含指定字符的行

sed 's/data/hello/p' f1 ---查找文檔中的指定字符,替換成新字符

sed 's/data/&123/g' f1 ---查找文檔中的指定字符,在其后追加字符

sed -n '/data/p' f1 ---顯示包含指定字符的行

具體sed的其他命令和參數(shù)可見下面幾個表格:

命令功能
*a*在當(dāng)前行后面加入一行或者文本
blabel 分支到腳本中帶有標(biāo)號的地方,如果標(biāo)號不存在就分支到腳本的末尾
*c*用新文本改變或者替代本行的文本
d從模式空間中制刪除指定行
D刪除模式空間中第一行
*i*在當(dāng)前行上面插入文本
h拷貝模式空間到內(nèi)存緩沖區(qū)
H追加模式空間內(nèi)容到內(nèi)存緩沖區(qū)
g獲得內(nèi)存緩沖區(qū)的內(nèi)容,并替代當(dāng)前模式空間中的文本
G獲得內(nèi)存緩沖區(qū)的內(nèi)容,并追加當(dāng)前模式空間中的文本
命令功能
l列表不能打印所指定的字符清單
n讀取下一個輸入行,用下一個命令處理新的行
N追加下一個輸入行到模式空間后面并在二者之間嵌入一個新的行,改變當(dāng)前行的號碼
p打印模式空間的行
P打印模式空間的第一行
q退出sed
r file從file中讀取行
t labelif**分支,從最后一行開始開始,一旦滿足要求,將直接到帶有標(biāo)號的命令出,或者到腳本的末尾**
T label錯誤分支,從最后一行開始開始,一旦滿足要求,將直接到帶有標(biāo)號的命令出,或者到腳本的末尾
命令功能
w file寫并追加到模塊空間file末尾
W file寫并追加到模塊空間的第一行到file末尾
!表示后面的命令對所有沒有被選定的行發(fā)生作用
s/re/string/用string替換正則表達式re
=打印當(dāng)前行號碼
#command把注釋擴展到下一個換行符以前
替換標(biāo)記
g行內(nèi)全面替換
p打印行
w把行寫入一個文件
命令功能
替換標(biāo)記(二)
x互換模塊空間的文本和緩沖區(qū)的文本
y把一個字符翻譯為另外的字符(此替換標(biāo)記不可用正**則表達式)**
選項
-e command允許多點編輯
--expression=command同上
-h,--help & --version幫助 & 查看sed 版本 (2個選項)
-n,--quiet,--silent取消默認輸出
-f script-file引導(dǎo)sed腳本文件名
--file=script-file同上

Sed匹配符號

元字符功能例子匹配
^指定行的開始/^linux/所有以linux開頭的行
$指定行的末尾/linux$/所有以linux結(jié)束的行
.匹配一個非換行符的字符/l…x/匹配所有包含l后面3個字符任意,最后為x的行
*匹配零或多個字符/*linux/匹配所有模板是一個或多個空格后緊跟linux的行
[]匹配一個指定范圍內(nèi)的字符[Ll]inux匹配包含Linux或linux的行
[^]匹配一個不再指定范圍內(nèi)的字符/a-egztp/匹配不再指定a-e及g-z區(qū)域內(nèi)的開頭并緊跟tp的字段
元字符功能例子匹配
&保存所搜字符用**來替換其他字符**s/linux/*&*/&*表示搜索字符串,因此linux將變?yōu)?linux****
/<指定單詞的開始/<linux/匹配包含linux開頭的單**詞的行**
/>指定單詞的結(jié)束/linux>/匹配包含以linux結(jié)尾的**單詞的行**
x{m}重復(fù)字符X,M多少次/o{5}/匹配包含5個o的行
x{m,}重復(fù)字符X,至少M次*/o{5,}*匹配至少5個o的行

由上表可見,sed的功能十分繁復(fù),所以我們初學(xué)可以暫時不必記憶那么多的格式,只需要先掌握咱們案例中最常用的幾項參數(shù)設(shè)置就好。

6.擴展正則表達式

顧名思義,擴展正則表達式一定是針對基礎(chǔ)正則表達式的一些補充。擴展正則表達式比基礎(chǔ)正則表達式多了幾個重要的符號。不過在使用這些擴展符號的時候需要使用egrep命令。

擴展元字符

作用

+

前一個字符匹配1次或任意多次。例:go+gle會匹配gogle、google或gooole如果有更多個o也會匹配。

前一個字符匹配0次或1次。如colou?r可以匹配colour或color。

|

匹配兩個或多個分支選擇。如was|his會匹配包含was的行,也會匹配包含his的行。

()

匹配其整體為一個字符,可以理解為由多個單個字符組成的大字符。如(dog)+會匹配dog、dogdog、dogdogdog等,因為被()包含的字符會當(dāng)成一個整體。但hello (world | earth )?會匹配hello world 及?hello earth

6.1()括號模式單元的使用:

[root@localhost ~]# egrep --color=auto "(l..e).*(l..e)" ./testlove is loverlike is likerlove is likerlike is lover[root@localhost ~]# egrep --color=auto "(l..e).*(\1)" ./test

#可用(\1)表示引用第一個模式單元,也就是第一次匹配第一行(l..e)在匹配到love的時候,就確定了l和e之間的..為o和v,在之后(\1)引用的時候也只會匹配love的字符串。

第二行l(wèi)ike同理。第二行匹配時..變成了ik,所以匹配到了后邊like字符串,而不能匹配

love字符串。

love is lover

like is liker

總結(jié)

以上是生活随笔為你收集整理的15.正则表达式扩展正则字符处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。