iOS高級(jí)強(qiáng)化--015:Regular Expressions

正則表達(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á)式

BREERE?者的區(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
渣男操作符:
類別 匹配類型 匹配字符
. 匹配所有的字符洋魂,除了newlinenull 通吃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-]表示匹配字?az還有-
錨點(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
  • .:匹配所有的字符,除了newlinenull

匹配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妓布、JavaC#炼幔、Ruby還是其他秋茫,在實(shí)現(xiàn)正則表達(dá)式時(shí)都有特殊的差別。Swift也不例外

Objective-CSwift都要求您轉(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代表xfooxxxxxxfos2代表o仙逻。 s1匹配p1, 但s2不匹配p2。本輪匹配失敗
  • 第三輪涧尿,繼續(xù)減少p1匹配量系奉,留出兩個(gè)字符, 字符串被分割成xfooxxxxxxfooo兩部分。結(jié)果同上
  • 第四輪姑廉,再次減少p1匹配量缺亮,字符串分割成xfooxxxxxxfoo兩個(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代表xs2代表fooxxxxxxfoos1匹配p1, 但s2不匹配p2粉铐。本輪匹配失斕墼肌;繼續(xù)上述匹配直到滿?p2

案例4:

模式.*+foo(侵占模式)

  • p1(.*+)
  • p2(foo)

查看匹配結(jié)果蝙泼,其中p1中的匹配?式使?侵占模式匹配

  • 匹配開始時(shí)讀?所有字符串程剥,和p1匹配成功,但沒有剩余字符串去和p2匹配汤踏。匹配失敗

簡單地說织鲸,貪婪模式和侵占模式相?,貪婪模式會(huì)在只有部分匹配成功的條件下溪胶,依次從多到少減少匹配成功部分模式的匹配數(shù)量搂擦,將字符留給模式其他部分去匹配。?侵占模式則是占有所有能匹配成功部分哗脖,絕不留給其他部分使?

案例5:

使用(fooq|foo)*(qbarquux|bar)完全匹配的字符串是瀑踢?

  • A、fooqbarquux
  • B才避、fooqbar
  • C橱夭、以上都選

僅選項(xiàng)B可以完全匹配,選項(xiàng)A只能匹配出fooqbar前半部分

案例6:

使用((a*)b)*\1\2完全匹配的字符串是桑逝?

  • A徘钥、aabababa
  • B、aabaabaabaabaa
  • C肢娘、以上都選

答案為選項(xiàng)C,選項(xiàng)AB都可以完全匹配

  • 如果分組不??次匹配(例如舆驶,如果后?跟著重復(fù)運(yùn)算符)橱健,則
    向后引?將匹配分組最后匹配的?字符串

案例7:

使用(one(x)|two(y))-and-(three\2|four\3)完全匹配的字符串是?

  • A沙廉、onex-and-threex
  • B拘荡、twoy-and-foury
  • C、onex-and-four
  • D撬陵、twoy-and-threey
  • E珊皿、twoy-and-threex

選項(xiàng)AB都可以完全匹配

  • 分組\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é)尾的渣男操作符.,除newlinenull匹配所有字符

案例9:

licensecredit的值抄淑,都改為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郑原“拢可以匹配ABABB颤专、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ù)的print時(shí),它就打印當(dāng)前行弟翘,當(dāng)print的參數(shù)是以逗號(hào)進(jìn)行分隔時(shí)虫腋,打印時(shí)則以空格作為定界符。在awkprint語句塊中雙引號(hào)是被當(dāng)作拼接符使用

案例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)試中有效

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仍侥,隨后出現(xiàn)的幾起案子要出,更是在濱河造成了極大的恐慌,老刑警劉巖农渊,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件患蹂,死亡現(xiàn)場離奇詭異,居然都是意外死亡砸紊,警方通過查閱死者的電腦和手機(jī)传于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醉顽,“玉大人沼溜,你說我怎么就攤上這事∮翁恚” “怎么了系草?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唆涝。 經(jīng)常有香客問我找都,道長,這世上最難降的妖魔是什么廊酣? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任能耻,我火速辦了婚禮,結(jié)果婚禮上啰扛,老公的妹妹穿的比我還像新娘嚎京。我一直安慰自己,他們只是感情好隐解,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布鞍帝。 她就那樣靜靜地躺著,像睡著了一般煞茫。 火紅的嫁衣襯著肌膚如雪帕涌。 梳的紋絲不亂的頭發(fā)上摄凡,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蚓曼,去河邊找鬼亲澡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纫版,可吹牛的內(nèi)容都是我干的床绪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼其弊,長吁一口氣:“原來是場噩夢啊……” “哼癞己!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梭伐,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤痹雅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后糊识,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绩社,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年赂苗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愉耙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哑梳,死狀恐怖劲阎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸠真,我是刑警寧澤悯仙,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吠卷,受9級(jí)特大地震影響锡垄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祭隔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一货岭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疾渴,春花似錦千贯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桩撮,卻和暖如春敦第,著一層夾襖步出監(jiān)牢的瞬間峰弹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工芜果, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞠呈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓右钾,卻偏偏與公主長得像蚁吝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舀射,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容