正則表達(dá)式學(xué)習(xí)
正則表達(dá)式:是處理字符串的?種表達(dá)?式。提供了?種從?組字符串中
選擇特定字符串的機(jī)制
POSIX
規(guī)范定義了UNIX
操作系統(tǒng)應(yīng)當(dāng)?持的功能壁榕,POSIX
規(guī)范的正則表達(dá)式:
BRE
:(Basic Regular Expression
)基本型正則表達(dá)式ERE
:(Extended Regular Express
)擴(kuò)展型正則表達(dá)式
BRE
和ERE
?者的區(qū)別萌丈,簡單的說就在于(
、)
揍很、{
郎楼、}
、+
窒悔、?
呜袁、|
這7
個(gè)特殊字符的使??法上:
- 在
BRE
中聋庵,如果想要這些字符表示特殊的含義托启,就需要把它們轉(zhuǎn)義蹭劈。元字符(
、)
哈打、{
伏蚊、}
帐萎、+
、?
、|
必須轉(zhuǎn)義之后才具有特殊含義均蜜,如\+
偶芍、\?
椎麦、\|
段化,?且也?持\1
、\2
之類反向引?- 反之缓升,在
ERE
中,如果要這些字符不表示特殊的含義绵跷,就需要把它們轉(zhuǎn)義。雖然BRE
名為“基本”?ERE
名為“擴(kuò)展”,但ERE
并不要求兼容BRE
的語法像啼,?是?成?體BRE
中的特殊字符:.
此疹、\
湖笨、[
眠菇、^
、$
、*
ERE
中的特殊字符多了7
個(gè),即:.
荷腊、\
、[
、^
杨幼、$
、*
、(
暖夭、)
邪码、{
奴潘、}
平委、+
、?
碉纳、|
正則表達(dá)式與通配符沒有任何關(guān)系,不是包含關(guān)系
- 通配符锭硼,是
Shell
提供的功能- 正則表達(dá)式只是?來處理字符串
如何學(xué)習(xí)正則表達(dá)式熙宇?
- 背蒋荚,一些特殊字符的意義
- 實(shí)際練習(xí)
案例:
?個(gè)常?的正則表達(dá)式
^1[3-9](\d{9})$
^
:錨點(diǎn)操作符,匹配字符串的開頭[3-9]
:列表操作符,只匹配中括號(hào)中的?個(gè)字符容为。-
:范圍操作符指定范圍\d
:代表0-9
數(shù)字{9}
:間隔運(yùn)算符寄雀,匹配前?個(gè)元素?次(\d{9})
:分組/捕獲組懂更,定義?個(gè)?表達(dá)式$
:錨點(diǎn)操作符脖阵,匹配字符串的結(jié)尾
特殊符號(hào)的意義
直抒胸臆操作符:
類別 匹配類型 匹配字符 Cat
字符串 Cat
,屬于串聯(lián)Cat
,不能匹配Catt
C
字符 C
C
渣男操作符:
類別 匹配類型 匹配字符 .
匹配所有的字符洋魂,除了 newline
和null
通吃 lsp
重復(fù)操作符:
類別 匹配類型 *
匹配前?個(gè)元素 0
次或多次+
匹配前?個(gè)元素 1
次或多次?
匹配前?個(gè)元素 0
次或1
次
間隔操作符 { ... }:
類別 匹配類型 {count}
匹配前?個(gè)元素 count
次{min,}
匹配前?個(gè)元素?少 min
次{min, max}
匹配前?個(gè)元素?少 min
次豁翎,?多max
次
備胎操作符:
類別 匹配類型 匹配字符 |
匹配前?個(gè)表達(dá)式或后?個(gè)表達(dá)式 在嗎?我懷孕了
列表操作符 [ ... ] and [^ ... ] :
?般操作符在列表操作符?會(huì)失去特殊意義,除了:
類別 匹配類型 ]
結(jié)束列表, []]
\
轉(zhuǎn)義字符 [:
字符類別操作符開始 :]
字符類別操作符結(jié)束 -
范圍操作符纷责, 0-9
字符類別操作符 [: ... :] :
類別 匹配類型 匹配字符 [:alnum:]
[A-Za-z0-9]
數(shù)字和字?字符 [:alpha:]
[A-Za-z]
字?字符 [:blank:]
[ \t]
空格和 TAB
[:cntrl:]
[\x00-\x1F\x7F]
控制符 [:digit:]
[0-9]
數(shù)字 [:graph:]
[\x21-\x7E]
可視字符 [:lower:]
[a-z]
?寫字?字符 [:print:]
[\x20-\x7E]
可視字符和空格( ASCII
曲横,040-0176
)[:punct:]
][!"#$%&'()*+,./:;<=>?@\^_`{|}~-]
標(biāo)點(diǎn)符號(hào) [:space:]
[\t\r\n\v\f]
空?字符 [:upper:]
[A-Z]
?寫字?字符 [:xdigit:]
[A-Fa-f0-9]
?六進(jìn)制字符
特殊字符類別操作符:
類別 匹配類型 匹配字符 \w
[:alnum:]
數(shù)字和字?字符 \d
[:digit:]
數(shù)字 \W
[^[:alnum:]]
除了數(shù)字和字?字符 \B
[^[:digit:]]
除了數(shù)字 \<
^
匹配字符串的開頭 \>
$
匹配字符串的結(jié)尾 \b
to\b
匹配to!
,但不匹配tomorrow
匹配單詞邊界字符
范圍操作符:
類別 匹配類型 -
匹配指定范圍昭娩,但是需在列表中使?,并指定范圍填物,如 [a-z]
雁刷。[-az]
或者[az-]
表示匹配字?a
和z
還有-
錨點(diǎn)操作符:
類別 匹配類型 ^
匹配字符串的開頭,需在開頭 $
匹配字符串的結(jié)尾或者換?符的前?個(gè)位置,需在結(jié)尾
- 如果
^
在列表操作符中使?企蹭,并且在?位送漠,代表取反
操作符優(yōu)先級(jí):
優(yōu)先級(jí)(由?到低) 操作符 歸類相關(guān)的括號(hào)符號(hào) [::]
轉(zhuǎn)義字符 \<特殊字符>
括號(hào)表達(dá) []
分組 ()
單字符重復(fù) * + 尼酿?{m, n}
串聯(lián) .
錨點(diǎn) ^ $
備選 |
基礎(chǔ)示例
grep
-v
:逆轉(zhuǎn)顯示-i
:忽略??寫-A
:向上顯示??-B
:向下顯示??-E
:啟?擴(kuò)展—color
:顯示顏?
egrep
- 使用
grep -E
,啟用ERE
擴(kuò)展型正則表達(dá)式
案例:
打開
test.swift
文件支救,寫入以下文本:struct LGTeacher { let name: String let class: String let credit:String let description: String } struct LGTeachers { let name: String let class: String let credit:String let description: String } extension LGTeacher { static var all: [LGTeacher] { [ LGTeacher( name: "Cooci", license: "http://creativecommons.org/licenses/by-sa/3.0", credit: "http://commons.wikimedia.org/wiki/User:Lin%C3%A91", description: "Basil is commonly used fresh in cooked recipes. In general, it is added at the last moment, as cooking quickly destroys the flavor. The fresh herb can be kept for a short time in plastic bags in the refrigerator, or for a longer period in the freezer, after being blanched quickly in boiling water. The dried herb also loses most of its flavor, and what little flavor remains tastes very different.9oo *oo" ), LGTeacher( name: "Kody", license: "http://creativecommons.org/licenses/by-sa/3.0", credit: "http://commons.wikimedia.org/wiki/User:Lin%C3%A91", description: "Saffron's aroma is often described by connoisseurs as reminiscent of metallic honey with grassy or hay-like notes, while its taste has also been noted as hay-like and sweet. Saffron also contributes a luminous yellow-orange colouring to foods. Saffron is widely used in Indian, Persian, European, Arab, and Turkish cuisines. Confectioneries and liquors also often include saffron." ), LGTeacher( name: "Hank", license: "http://creativecommons.org/licenses/by-sa/3.0", credit: "http://commons.wikimedia.org/wiki/User:Raul654", description: "Marjoram is used for seasoning soups, stews, dressings and sauce. Majorana has been scientifically proved to be beneficial in the treatment of gastric ulcer, hyperlipidemia and diabetes. Majorana hortensis herb has been used in the traditional Austrian medicine for treatment of disorders of the gastrointestinal tract and infections." ), LGTeacher( name: "CC", license: "http://www.gnu.org/licenses/old-licenses/fdl-1.2.html", credit: "http://commons.wikimedia.org/wiki/User:Fir0002", description: "The leaves, both fresh and dried, are used in traditional Italian cuisine. They have a bitter, astringent taste and are highly aromatic, which complements a wide variety of foods. Herbal tea can be made from the leaves. When burnt, they give off a mustard-like smell and a smell similar to burning wood, which can be used to flavor foods while barbecuing. Rosemary is high in iron, calcium and vitamin B6.") , LGTeacher( name: "Cat", license: "http://commons.wikimedia.org/wiki/File:AniseSeeds.jpg", credit: "http://commons.wikimedia.org/wiki/User:Ben_pcc", description: "Anise is sweet and very aromatic, distinguished by its characteristic flavor. The seeds, whole or ground, are used in a wide variety of regional and ethnic confectioneries, including black jelly beans, British aniseed balls, Australian humbugs, and others. The Ancient Romans often served spiced cakes with aniseseed, called mustaceoe at the end of feasts as a digestive. " ) ] } }
匹配包含
LG
的內(nèi)容grep "LG" test.swift ------------------------- struct LGTeacher { struct LGTeachers { extension LGTeacher { static var all: [LGTeacher] { [ LGTeacher( LGTeacher( LGTeacher( LGTeacher( LGTeacher(
匹配包含
LG
的內(nèi)容恃轩,將每一行的匹配結(jié)果松忍,都向下多顯示一行grep "LG" test.swift -A 1 ------------------------- struct LGTeacher { let name: String -- struct LGTeachers { let name: String -- extension LGTeacher { static var all: [LGTeacher] { [ LGTeacher( name: "Cooci", -- LGTeacher( name: "Kody", -- LGTeacher( name: "Hank", -- LGTeacher( name: "CC", -- LGTeacher( name: "Cat",
匹配包含
LG
的內(nèi)容筷厘,將每一行的匹配結(jié)果鸣峭,上下各多顯示一行grep "LG" test.swift -A 1 -B 1 ------------------------- struct LGTeacher { let name: String -- -- struct LGTeachers { let name: String -- -- extension LGTeacher { static var all: [LGTeacher] { [ LGTeacher( name: "Cooci", -- -- ), LGTeacher( name: "Kody", -- -- ), LGTeacher( name: "Hank", -- -- ), LGTeacher( name: "CC", -- -- , LGTeacher( name: "Cat",
匹配包含
lgteacher
的內(nèi)容,忽略大小寫grep "lgteacher" test.swift -i ------------------------- struct LGTeacher { struct LGTeachers { extension LGTeacher { static var all: [LGTeacher] { [ LGTeacher( LGTeacher( LGTeacher( LGTeacher( LGTeacher(
匹配過濾
LGTeacher
后的內(nèi)容grep "LGTeacher" test.swift -v
匹配包含
LGTeacher
的內(nèi)容酥艳,但不匹配LGTeachers
grep "LGTeacher[^s]" test.swift ------------------------- struct LGTeacher { extension LGTeacher { static var all: [LGTeacher] { [ LGTeacher( LGTeacher( LGTeacher( LGTeacher( LGTeacher(
匹配包含
oo
的內(nèi)容grep "oo" test.swift
匹配包含
oo
的內(nèi)容,過濾前面由小寫字母開頭的內(nèi)容grep "[^a-z]oo" test.swift //或者 grep "[^[:lower:]]oo" test.swift
匹配包含
oo
的內(nèi)容,只保留數(shù)字或符號(hào)開頭的內(nèi)容grep "[^A-Za-z]oo" test.swift
匹配包含
oo
的內(nèi)容,只保留數(shù)字開頭的內(nèi)容grep "[0-9]oo" test.swift //或者 grep "\doo" test.swift
匹配包含
oo
的內(nèi)容,只保留符號(hào)開頭的內(nèi)容grep "[^A-Za-z0-9]oo" test.swift //或者 grep "\Woo" test.swift
匹配包含
oo
的內(nèi)容,過濾前面由符號(hào)開頭的內(nèi)容grep "[A-Za-z0-9]oo" test.swift //或者 grep "\woo" test.swift
使用
.
占中間兩位,匹配C
開頭冀偶,ci
結(jié)尾的內(nèi)容grep "C..ci" test.swift ------------------------- name: "Cooci",
匹配
C
開頭,使用.
占后兩位的內(nèi)容grep "C.." test.swift
.
:匹配所有的字符,除了newline
和null
匹配
Co
開頭淡诗,使用*
占后一位的內(nèi)容grep "Co*" test.swift
*
:匹配前?個(gè)元素0
次或多次
匹配
Coo
開頭溢陪,使用*
占后一位的內(nèi)容grep "Coo*" test.swift
匹配
C
開頭脉课,后面接兩個(gè)o
的內(nèi)容grep -E "Co{2}" test.swift ------------------------- name: "Cooci",
- 間隔操作符
{ ... }
,是ERE
中支持的特殊符號(hào)砌庄。grep
命令支持ERE
表達(dá)式扒俯,需要增加-E
參數(shù)
分組與向后引?
分組\捕獲組操作符
(( ... ) or \( ... \))
:
- 定義?個(gè)?表達(dá)式灌闺。正則表達(dá)式將此序列視為?個(gè)單元坦敌。圓括號(hào)在整體匹配完后進(jìn)?匹配
- 可以配合反向引?操作符,重復(fù)使?分組匹配的結(jié)果
反向引?操作符
(\digit)
:
- 反向引?操作符由
\數(shù)字
表示隆檀,數(shù)字需介于1-9
坠陈,代表引?那個(gè)分組的匹配結(jié)果
案例1:
匹配包含
oo
的內(nèi)容,只保留數(shù)字開頭的內(nèi)容,使用(\d)
進(jìn)行分組grep -E "(\d)oo" test.swift
- 分組
( ... )
,是ERE
中支持的特殊符號(hào)拥褂。grep
命令支持ERE
表達(dá)式茄螃,需要增加-E
參數(shù)
案例2:
通過
\1
獲取第一個(gè)分組內(nèi)容grep -E "description(.*)(\1)" test.swift
- 反向引?操作符
(\digit)
,代表引?那個(gè)分組的匹配結(jié)果
\ 字符
以下內(nèi)容在部分語?中不?持
每種環(huán)境埠偿,?論是
Python
锻煌、Perl
妓布、Java
、C#
炼幔、Ruby
還是其他秋茫,在實(shí)現(xiàn)正則表達(dá)式時(shí)都有特殊的差別。Swift
也不例外
Objective-C
和Swift
都要求您轉(zhuǎn)義?字字符串中的特殊字符(即乃秀,在它們
前?加反斜杠\
字符)肛著。反斜杠本身就是這樣的特殊字符之?。由于?于創(chuàng)建
正則表達(dá)式的模式也是字符串跺讯,因此會(huì)增加復(fù)雜性枢贿,因?yàn)樵谑?Stringand
時(shí)
需要轉(zhuǎn)義反斜杠字符NSRegularExpression
這意味著標(biāo)準(zhǔn)正則表達(dá)式
\.
將出現(xiàn)\\.
在您的Swift
(或Objective-C
)代碼中
- ?字
\\.
定義了?個(gè)類似于以下字符串:\.
- 正則表達(dá)式
\.
然后將匹配單個(gè)句點(diǎn)字符
貪婪模式
貪婪模式、勉強(qiáng)模式與侵占模式:
貪婪匹配 勉強(qiáng)匹配 侵占匹配 作? X?
X??
X?+
匹配 X
零次或?次X*
X*?
X*+
匹配 X
零次或多次X+
X+?
X++
匹配 X
?次或多次X{n}
X{n}?
X{n}+
匹配 X
刀脏,n
次X{n,}
X{n,}?
X{n,}+
匹配 X
?少n
次X{n,m}
X{n,m}?
X{n,m}+
匹配 X
?少n
次局荚,但不多于m
次
案例1:
匹配
test.swift
文件中,description
相關(guān)內(nèi)容
grep "description.*\"$" test.swift //或者 grep -E "description(.*)[\"]$" test.swift
案例2:
假定要分析的字符串是
xfooxxxxxxfoo
模式
.*foo
(貪婪模式)由兩部分
p1
:(.*)
p2
:(foo)
查看匹配結(jié)果愈污,其中
p1
中的匹配?式使?默認(rèn)?式(貪婪型)
- 第?輪:匹配開始時(shí)耀态,
p1
匹配所有字符xfooxxxxxx
,匹配成功暂雹,但p2
?匹配字符首装,本輪匹配失敗- 第?輪:減少
p1
部分的匹配量,留出最后?個(gè)字符, 此時(shí)存在兩個(gè)字符串杭跪,s1
代表xfooxxxxxxfo
和s2
代表o
仙逻。s1
匹配p1
, 但s2
不匹配p2
。本輪匹配失敗- 第三輪涧尿,繼續(xù)減少
p1
匹配量系奉,留出兩個(gè)字符, 字符串被分割成xfooxxxxxxfo
和oo
兩部分。結(jié)果同上- 第四輪姑廉,再次減少
p1
匹配量缺亮,字符串分割成xfooxxxxxx
和foo
兩個(gè)部分,這次p1/p2
同時(shí)匹配庄蹋。返回匹配成功
案例3:
模式
.*?foo
(勉強(qiáng)模式)最?匹配?式
p1
:(.*?)
p2
:(foo)
查看匹配結(jié)果瞬内,其中
p1
中的匹配?式使?勉強(qiáng)模式匹配
- 第?輪:
p1
由于是0
或任意次迷雪,?先匹配0
次。所以直接?字符串去匹配p2
虫蝶,但p2
?匹配字符章咧,本輪匹配失敗- 第?輪:增加
p1
部分的匹配量,匹配x
能真。此時(shí)存在兩個(gè)字符串赁严,s1
代表x
和s2
代表fooxxxxxxfoo
。s1
匹配p1
, 但s2
不匹配p2
粉铐。本輪匹配失斕墼肌;繼續(xù)上述匹配直到滿?p2
案例4:
模式
.*+foo
(侵占模式)
p1
:(.*+)
p2
:(foo)
查看匹配結(jié)果蝙泼,其中
p1
中的匹配?式使?侵占模式匹配
- 匹配開始時(shí)讀?所有字符串程剥,和
p1
匹配成功,但沒有剩余字符串去和p2
匹配汤踏。匹配失敗
簡單地說织鲸,貪婪模式和侵占模式相?,貪婪模式會(huì)在只有部分匹配成功的條件下溪胶,依次從多到少減少匹配成功部分模式的匹配數(shù)量搂擦,將字符留給模式其他部分去匹配。?侵占模式則是占有所有能匹配成功部分哗脖,絕不留給其他部分使?
案例5:
使用
(fooq|foo)*(qbarquux|bar)
完全匹配的字符串是瀑踢?
A
、fooqbarquuxB
才避、fooqbarC
橱夭、以上都選僅選項(xiàng)
B
可以完全匹配,選項(xiàng)A
只能匹配出fooqbar
前半部分
案例6:
使用
((a*)b)*\1\2
完全匹配的字符串是桑逝?
A
徘钥、aabababaB
、aabaabaabaabaaC
肢娘、以上都選答案為選項(xiàng)
C
,選項(xiàng)A
和B
都可以完全匹配
- 如果分組不??次匹配(例如舆驶,如果后?跟著重復(fù)運(yùn)算符)橱健,則
向后引?將匹配分組最后匹配的?字符串
案例7:
使用
(one(x)|two(y))-and-(three\2|four\3)
完全匹配的字符串是?
A
沙廉、onex-and-threexB
拘荡、twoy-and-fouryC
、onex-and-fourD
撬陵、twoy-and-threeyE
珊皿、twoy-and-threex選項(xiàng)
A
和B
都可以完全匹配
- 分組
\2
网缝、\3
分別對(duì)應(yīng)(x)
、(y)
蟋定,當(dāng)(x)
匹配失敗粉臊,分組\2
的位置存在,但分組報(bào)錯(cuò)- 當(dāng)訪問報(bào)錯(cuò)的分組驶兜,匹配將會(huì)中斷
案例8:
在
t.swift
文件中扼仲,刪除description
節(jié)點(diǎn)
使用
description:(\W)(.*)
將匹配的內(nèi)容替換為空
結(jié)尾的渣男操作符
.
,除newline
和null
匹配所有字符
案例9:
將
license
和credit
的值抄淑,都改為https://www.baidu.com/
使用
(license|credit):[\W](.)*
將匹配的內(nèi)容替換為$1: "https://www.baidu.com/",
$1
表示分組\1
的(license|credit)
更?級(jí)的?法
零寬斷?
斷?:在指定位置應(yīng)該滿??定的條件
當(dāng)捕獲組以開頭時(shí)
?=
屠凶,表示該組將被?作零寬度正預(yù)測先?斷?,僅當(dāng)前?個(gè)模式與捕獲組中的模式相匹配時(shí)才與前?個(gè)模式匹配肆资。例如矗愧,A(?=B)
與A
匹配,并且?上跟著B
郑原“拢可以匹配AB
、ABB
颤专、ACB
Unicode
匹配特定類別的
Unicode
字符\p{ ... }
:
\p{L}
所有字符纽哥,\p{Lu}
所有?寫字符,\p{N}
\P{}
匹配不特定類別的Unicode
字符
sed命令
sed
命令:可以將數(shù)據(jù)進(jìn)?替換栖秕、刪除春塌、新增、選取特定內(nèi)容等功能簇捍,?作?整?字符處理
命令格式
sed [options] 'command' file(s) sed [options] -f scriptfile file(s)
選項(xiàng)
-e<script>或--expression=<script>:以選項(xiàng)中的指定的script來處理輸入的文本文件只壳; -f<script文件>或--file=<script文件>:以選項(xiàng)中指定的script文件來處理輸入的文本文件; -h或--help:顯示幫助暑塑; -n或--quiet或——silent:僅顯示script處理后的結(jié)果吼句; -V或--version:顯示版本信息。
參數(shù)
文件:指定待處理的文本文件列表
sed命令
a\ # 在當(dāng)前行下面插入文本事格。 i\ # 在當(dāng)前行上面插入文本惕艳。 c\ # 把選定的行改為新的文本。 d # 刪除驹愚,刪除選擇的行远搪。 D # 刪除模板塊的第一行。 s # 替換指定字符 h # 拷貝模板塊的內(nèi)容到內(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 # 讀取下一個(gè)輸入行涮因,用下一個(gè)命令處理新的行而不是用第一個(gè)命令废睦。 N # 追加下一個(gè)輸入行到模板塊后面并在二者間嵌入一個(gè)新行,改變當(dāng)前行號(hào)碼蕊退。 p # 打印模板塊的行郊楣。 P # (大寫) 打印模板塊的第一行。 q # 退出Sed瓤荔。 b lable # 分支到腳本中帶有標(biāo)記的地方净蚤,如果分支不存在則分支到腳本的末尾。 r file # 從file中讀行输硝。 t label # if分支今瀑,從最后一行開始,條件一旦滿足或者T点把,t命令橘荠,將導(dǎo)致分支到帶有標(biāo)號(hào)的命令處,或者到腳本的末尾郎逃。 T label # 錯(cuò)誤分支哥童,從最后一行開始,一旦發(fā)生錯(cuò)誤或者T褒翰,t命令贮懈,將導(dǎo)致分支到帶有標(biāo)號(hào)的命令處,或者到腳本的末尾优训。 w file # 寫并追加模板塊到file末尾朵你。 W file # 寫并追加模板塊的第一行到file末尾。 ! # 表示后面的命令對(duì)所有沒有被選定的行發(fā)生作用揣非。 = # 打印當(dāng)前行號(hào)碼抡医。 # # 把注釋擴(kuò)展到下一個(gè)換行符以前。
sed替換標(biāo)記
g # 表示行內(nèi)全面替換早敬。 p # 表示打印行忌傻。 w # 表示把行寫入一個(gè)文件。 x # 表示互換模板塊中的文本和緩沖區(qū)中的文本搞监。 y # 表示把一個(gè)字符翻譯為另外的字符(但是不用于正則表達(dá)式) \1 # 子串匹配標(biāo)記 & # 已匹配字符串標(biāo)記
sed元字符集
^ # 匹配行開始芯勘,如:/^sed/匹配所有以sed開頭的行。 $ # 匹配行結(jié)束腺逛,如:/sed$/匹配所有以sed結(jié)尾的行。 . # 匹配一個(gè)非換行符的任意字符,如:/s.d/匹配s后接一個(gè)任意字符棍矛,最后是d安疗。 * # 匹配0個(gè)或多個(gè)字符,如:/*sed/匹配所有模板是一個(gè)或多個(gè)空格后緊跟sed的行够委。 [] # 匹配一個(gè)指定范圍內(nèi)的字符荐类,如/[sS]ed/匹配sed和Sed。 [^] # 匹配一個(gè)不在指定范圍內(nèi)的字符茁帽,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個(gè)字母開頭玉罐,緊跟ed的行。 \(..\) # 匹配子串潘拨,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers娄帖。 & # 保存搜索字符用來替換其他字符勿决,如s/love/ **&** /,love這成 **love** 琅束。 \< # 匹配單詞的開始扭屁,如:/\<love/匹配包含以love開頭的單詞的行。 \> # 匹配單詞的結(jié)束涩禀,如/love\>/匹配包含以love結(jié)尾的單詞的行料滥。 x\{m\} # 重復(fù)字符x,m次艾船,如:/0\{5\}/匹配包含5個(gè)0的行葵腹。 x\{m,\} # 重復(fù)字符x,至少m次丽声,如:/0\{5,\}/匹配至少有5個(gè)0的行礁蔗。 x\{m,n\} # 重復(fù)字符x,至少m次雁社,不多于n次浴井,如:/0\{5,10\}/匹配5~10個(gè)0的行。
參考文檔:sed命令
awk命令
awk
命令:?sed
更精準(zhǔn)霉撵,通常將??在切割成相應(yīng)的字段磺浙,再去處理
命令格式
awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s)
選項(xiàng)
-F fs fs指定輸入分隔符,fs可以是字符串或正則表達(dá)式徒坡,如-F: -v var=value 賦值一個(gè)用戶定義變量撕氧,將外部變量傳遞給awk -f scripfile 從腳本文件中讀取awk命令 -m[fr] val 對(duì)val值設(shè)置內(nèi)在限制,-mf選項(xiàng)限制分配給val的最大塊數(shù)目喇完;-mr選項(xiàng)限制記錄的最大數(shù)目伦泥。這兩個(gè)功能是Bell實(shí)驗(yàn)室版awk的擴(kuò)展功能,在標(biāo)準(zhǔn)awk中不適用。
awk
腳本是由模式和操作組成的模式可以是以下任意一個(gè):
- /正則表達(dá)式/:使用通配符的擴(kuò)展集
- 關(guān)系表達(dá)式:使用運(yùn)算符進(jìn)行操作不脯,可以是字符串或數(shù)字的比較測試
- 模式匹配表達(dá)式:用運(yùn)算符
~
(匹配)和!~
(不匹配)BEGIN
語句塊府怯、pattern
語句塊、END
語句塊操作由一個(gè)或多個(gè)命令防楷、函數(shù)牺丙、表達(dá)式組成,之間由換行符或分號(hào)隔開复局,并位于大括號(hào)內(nèi)冲簿,主要部分是:
- 變量或數(shù)組賦值
- 輸出命令
- 內(nèi)置函數(shù)
- 控制流語句
awk
腳本基本結(jié)構(gòu)awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
一個(gè)
awk
腳本通常由:BEGIN
語句塊、能夠使用模式匹配的通用語句塊亿昏、END
語句塊三部分組成峦剔,這三個(gè)部分是可選的。任意一個(gè)部分都可以不出現(xiàn)在腳本中龙优,腳本通常是被單引號(hào)
或雙引號(hào)
中awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename awk "BEGIN{ i=0 } { i++ } END{ print i }" filename
awk
的工作原理awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
- 第一步:執(zhí)行
BEGIN{ commands }
語句塊中的語句- 第二步:從文件或標(biāo)準(zhǔn)輸入
(stdin)
讀取一行羊异,然后執(zhí)行pattern{ commands }
語句塊,它逐行掃描文件彤断,從第一行到最后一行重復(fù)這個(gè)過程野舶,直到文件全部被讀取完畢- 第三步:當(dāng)讀至輸入流末尾時(shí),執(zhí)行
END{ commands }
語句塊
案例1:
echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' Start A line 1 A line 2 End
BEGIN
語句塊在awk
開始從輸入流中讀取行之前
被執(zhí)行宰衙,這是一個(gè)可選的語句塊平道,比如變量初始化、打印輸出表格的表頭等語句通彻┝叮可以寫在BEGIN
語句塊中END
語句塊在awk
從輸入流中讀取完所有的行之后
即被執(zhí)行一屋,比如打印所有行的分析結(jié)果這類信息匯總都是在END
語句塊中完成,它也是一個(gè)可選語句塊pattern
語句塊中的通用命令是最重要的部分袋哼,它也是可選的冀墨。如果沒有提供pattern
語句塊,則默認(rèn)執(zhí)行{ print }
涛贯,即打印每一個(gè)讀取到的行诽嘉,awk
讀取的每一行都會(huì)執(zhí)行該語句塊
案例2:
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' v1 v2 v3
- 當(dāng)使用不帶參數(shù)的
awk
的
案例3:
雙引號(hào)拼接使用
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3
{ }
類似一個(gè)循環(huán)體稀余,會(huì)對(duì)文件中的每一行進(jìn)行迭代悦冀,通常變量初始化語句(如:i=0
)以及打印文件頭部的語句放入BEGIN
語句塊中,將打印的結(jié)果等語句放在END
語句塊中
參考文檔:awk命令
lldb使?正則對(duì)指定代碼添加斷點(diǎn)
對(duì)符合正則表達(dá)式的符號(hào)下斷點(diǎn)
breakpoint set --func-regex=[regular-expression]
對(duì)指定庫中的符合正則表達(dá)式的符號(hào)下斷點(diǎn)
breakpoint set --func-regex=[regular-expression] --shlib=libfoo.dylib
通過對(duì)指定的正則表達(dá)式對(duì)?件內(nèi)容設(shè)置斷點(diǎn)
breakpoint set --source-pattern-regexp [regular-expression] --file [SourceFile]
案例
在
Block
源碼中睛琳,搜索block
盒蟆、copy
相關(guān)的代碼使用
(.*)[B|b]lock(.*)[C|c]opy(.*)
匹配相關(guān)代碼
使用命令對(duì)符合正則的符號(hào)下斷點(diǎn)
breakpoint set --func-regex=(.*)[B|b]lock(.*)[C|c]opy(.*)
- 共設(shè)置
1990
處斷點(diǎn)使用
br
踏烙、-r
等縮寫形式br set -r (.*)[B|b]lock(.*)[C|c]opy(.*)
- 使用長參數(shù)
--func-regex
,后面的值可以用等號(hào)或空格設(shè)置- 使用短參數(shù)
-r
历等,后面的值只能用空格設(shè)置更簡單的縮寫:
rb
命令rb (.*)[B|b]lock(.*)[C|c]opy(.*)
查看
rb
命令help rb ------------------------- 'rb' is an abbreviation for 'breakpoint set -r %1'
指定在動(dòng)態(tài)庫
libsystem_blocks.dylib
中設(shè)置斷點(diǎn)rb (.*)[B|b]lock(.*)[C|c]opy(.*) --shlib=libsystem_blocks.dylib
- 斷點(diǎn)設(shè)置的范圍縮小宙帝,共設(shè)置
3
處斷點(diǎn)使用
-s
縮寫參數(shù)rb (.*)[B|b]lock(.*)[C|c]opy(.*) -s libsystem_blocks.dylib
對(duì)指定?件內(nèi)容設(shè)置斷點(diǎn)
br set --source-pattern-regexp (.*)[B|b]lock(.*)[C|c]opy(.*) --file runtime.cpp
使用
-p
、-f
等縮寫參數(shù)br set -p (.*)[B|b]lock(.*)[C|c]opy(.*) -f runtime.cpp
自定義簡寫命令
使用
command alias
命令募闲,為br set -p
創(chuàng)建簡寫命令command alias pb br set -p %1 -f %2 ------------------------- error: 'br' is not an existing command.
br
命令已經(jīng)是breakpoint
的簡寫形式,這里必須對(duì)breakpoint
命令進(jìn)行設(shè)置command alias pb breakpoint set -p %1 -f %2
設(shè)置成功后愿待,可以直接使用簡寫命令
pb (.*)[B|b]lock(.*)[C|c]opy(.*) runtime.cpp
查看
pb
命令help pb ------------------------- 'pb' is an abbreviation for 'breakpoint set -p %1 -f %2'
在
lldb
中設(shè)置的簡寫命令浩螺,僅在本次調(diào)試中有效