大家好,今天來為大家解答sed正則表達式替換這個問題的一些問題點,包括sed擴展正則表達式也一樣很多人還不知道,因此呢,今天就來為大家分析分析,現在讓我們一起來看看吧!如果解決了您的問題,還望您關注下本站哦,謝謝~
正則表達式中怎么匹配換行符
\n是回車換行,就是光標移動到下一行,從下一行開始輸入輸出。跟換行符效果一樣。\r則只是回車,光標不移動。正則表達式,又稱正規表示法、常規表示法(英語:RegularExpression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex,復數有regexps、regexes、regexen。
mysql如何截取正則表達式的內容
mysql中的正則表達式是一種匹配,用于篩選出滿足條件的記錄。我們需要利用其它的函數或者手段才能截取出正則表達式中的內容。
mysql中的正則表達式mysql中用regexp這個關鍵字表示正則表達式的匹配,常用的正則表達式模式,mysql都支持,和PhP或者PERL中腳本語言比較相似。
^表示匹配字符串的起始位置;
$表示匹配字符串的結束位置;
*表示匹配前面字符的零次或者多次;
?表示0或者1個匹配;
+表示1或者多個匹配
{n}表示匹配n個;
[0-9]表示數字的0-9匹配。
selectnamefrompersonwherenameregexp'^王'表示匹配姓名中王姓開頭的記錄截取正則表達式中的內容截取內容一般會用到字符串截取的相差函數,mid或者substr,即截取某一部分字符串的內容做為我們想要的結果。當然對于一些簡單的內容截取,left\right函數都是可以直接使用的。
比如,我們希望獲取訪問了某個子目錄的瀏覽量及用戶數,就可以通過regexp進行匹配,然后再進行截取。
selectcreate_date,local_urlfrompage_viewregexp'^https://'limit0,100我們希望統計出子目錄形如member,articl下的頁面訪問情況,這個時候我們就可以結合字符串截取函數就可以截取出想要的結果,
selectcreate_date,local_url,instr(local_url,'/member/')url_index,(casewhen(local_urlregexp'^http(s)?://([\w-]+\.).*/member/.*')thenmid(local_url,1,instr(local_url,'/member/')+length('/member/')-1)elsenullend)cat_urlfrompage_viewlimit0,100;執行該SQL語句,我們就可以截取出子目錄的數據,根據截取出來的數據,進一步就可以進行統計得到我們期望的結果。
MySQL正則表達式入門教程
MySQL一直以來都支持正則匹配,不過對于正則替換則一直到MySQL8.0才支持。對于這類場景,以前要么在MySQL端處理,要么把數據拿出來在應用端處理。
比如我想把表y1的列str1的出現第3個action的子串替換成dble,怎么實現?
1.自己寫SQL層的存儲函數。代碼如下寫死了3個,沒有優化,僅僅作為演示,MySQL里非常不建議寫這樣的函數。
mysql
DELIMITER$$
USE`ytt`$$
DROPFUNCTIONIFEXISTS`func_instr_simple_ytt`$$
CREATEDEFINER=`root`@`localhost`FUNCTION`func_instr_simple_ytt`(
f_strVARCHAR(1000),--Parameter1
f_substrVARCHAR(100),--Parameter2
f_replace_strvarchar(100),
f_timesint--timescounter.onlysupport3.
)RETURNSvarchar(1000)
BEGIN
declarev_resultvarchar(1000)default'ytt';--result.
declarev_substr_lenintdefault0;--searchstringlength.
setf_times=3;--onlysupport3.
setv_substr_len=length(f_substr);
selectinstr(f_str,f_substr)into@p1;--Firstrealposition.
selectinstr(substr(f_str,@p1+v_substr_len),f_substr)into@p2;Secondaryvirtualposition.
selectinstr(substr(f_str,@p2+@p1+2*v_substr_len-1),f_substr)into@p3;--Thirdvirtualposition.
if@p1>0&&@p2>0&&@p3>0then--Fine.
select
concat(substr(f_str,1,@p1+@p2+@p3+(f_times-1)*v_substr_len-f_times)
,f_replace_str,
substr(f_str,@p1+@p2+@p3+f_times*v_substr_len-2))intov_result;
else
setv_result=f_str;--Neverchanged.
endif;
--Purgeallsessionvariables.
set@p1=null;
set@p2=null;
set@p3=null;
returnv_result;
end;
$$
DELIMITER;
--調用函數來更新:
mysql>updatey1setstr1=func_instr_simple_ytt(str1,'action','dble',3);
QueryOK,20rowsaffected(0.12sec)
Rowsmatched:20Changed:20Warnings:0
2.導出來用sed之類的工具替換掉在導入,步驟如下:(推薦使用)1)導出表y1的記錄。
mysqlmysql>select*fromy1intooutfile'/var/lib/mysql-files/y1.csv';QueryOK,20rowsaffected(0.00sec)
2)用sed替換導出來的數據。
shellroot@ytt-Aspire-V5-471G:/var/lib/mysql-files#sed-i's/action/dble/3'y1.csv
3)再次導入處理好的數據,完成。
mysql
mysql>truncatey1;
QueryOK,0rowsaffected(0.99sec)
mysql>loaddatainfile'/var/lib/mysql-files/y1.csv'intotabley1;
QueryOK,20rowsaffected(0.14sec)
Records:20Deleted:0Skipped:0Warnings:0
以上兩種還是推薦導出來處理好了再重新導入,性能來的高些,而且還不用自己費勁寫函數代碼。那MySQL8.0對于以上的場景實現就非常簡單了,一個函數就搞定了。
mysqlmysql>updatey1setstr1=regexp_replace(str1,'action','dble',1,3);QueryOK,20rowsaffected(0.13sec)Rowsmatched:20Changed:20Warnings:0
還有一個regexp_instr也非常有用,特別是這種特指出現第幾次的場景。比如定義SESSION變量@a。
mysqlmysql>set@a='aabbcceefilucy111bs234523556119101020301040';QueryOK,0rowsaffected(0.04sec)
拿到至少兩次的數字出現的第二次子串的位置。
mysqlmysql>selectregexp_instr(@a,'[:digit:]{2,}',1,2);+--------------------------------------+|regexp_instr(@a,'[:digit:]{2,}',1,2)|+--------------------------------------+|50|+--------------------------------------+1rowinset(0.00sec)
那我們在看看對多字節字符支持如何。
mysql
mysql>set@a='中國美國俄羅斯日本中國北京上海深圳廣州北京上海武漢東莞北京青島北京';
QueryOK,0rowsaffected(0.00sec)
mysql>selectregexp_instr(@a,'北京',1,1);
+-------------------------------+
|regexp_instr(@a,'北京',1,1)|
+-------------------------------+
|17|
+-------------------------------+
1rowinset(0.00sec)
mysql>selectregexp_instr(@a,'北京',1,2);
+-------------------------------+
|regexp_instr(@a,'北京',1,2)|
+-------------------------------+
|29|
+-------------------------------+
1rowinset(0.00sec)
mysql>selectregexp_instr(@a,'北京',1,3);
+-------------------------------+
|regexp_instr(@a,'北京',1,3)|
+-------------------------------+
|41|
+-------------------------------+
1rowinset(0.00sec)
那總結下,這里我提到了MySQL8.0的兩個最有用的正則匹配函數regexp_replace和regexp_instr。針對以前類似的場景算是有一個完美的解決方案。
如何用sed命令來批量替換文件內容
謝謝邀請,我來回答一下這個shell命令!
sed命令特點sed命令既可以直接輸入到控制臺中執行,也可以放在腳本文件中執行
sed對于傳入的數據流會逐行的讀取
對于每行中匹配到的數據才會使用命令進行修改
它并不會修改原始的數據
生成的新數據會輸出到stdout,一般是控制臺,也可以輸出到文件
替換命令使用s(1)使用管道命令輸入數據
(2)替換文件中的數據
1.log
是我們的數據文件我們直接處理
1.log
這個文件的數據,并且這次我們使用兩個匹配命令(用分號隔開就行,前面加了一個-e,其實不加-e也沒問題),可以發現處理后的數據已經正確的打印出來了,如果你再去查看1.log
的數據,會發現sed并不會修改源文件中的數據。如果需要把生成的新數據輸出到一個特定的文件中,可以使用重定向大于號:
(3)將命令寫在文件中
有時我們會反復用一些命令,如果每次都需要手動輸入那就太麻煩了,好在我們可以把這些匹配命令寫在一個文件中
看上圖,我們現在把命令寫在了
s.sed
文件中,運行sed命令只需要在前面加-f就可以了,是不是很方便。(4)替換標記
我們可以認為每個替換命令就是一個正則表達式,所以每單個命令在一行中只會被使用一次,靠前的命令會被優先使用,要想全局匹配可以在命令后面加一個g
可以發現第一行在加上g的情況下,已經被完全匹配,這個g也可以被數字代替,指定替換第幾個位置。
也可以使用w來將生成的新數據輸入到文件中,但是在多條命令情況不是很好用!
(5)單行替換
文章開頭說了,sed會一行一行的查詢,有時我們只想替換指定行的數據,那應該怎么辦呢?可以在s字母前面加一個數字代表第幾行
看上圖只替換了第二行的數據。
我們還可以指定行區間`開始行+逗號+結束行`
如上圖,第一條命令替換第二行和第三行的數據($代表最后一行)
注意,對于這種方式的多條命令指定的行數只對單條命令生效!當然我們可以用大括號將所有的匹配命令括起來,把指定的行放在大括號的左側,那么指定的行就會作用于多條命令,如下圖:
另外還有一種方式可以指定特定的行,就是在s前面再加一個文本匹配命令,如下圖:
我們用These這個字符匹配第二行(These字符串前面必須加上斜杠)
刪除命令d(1)上面介紹的指定行數也適用于刪除命令
無論是行數字匹配還是文本匹配都沒問題。
還可以使用匹配文本的方式刪除區間,如下圖:
匹配了These和Those字符之間的三行。
插入i和附加a這兩個命令和js中insert、append語義一樣,果然語言都是相通的!
這兩個命令比較簡單,但是要注意前面的行不能是區間,這個應該比較好理解!
修改行c這個命令會替換整行數據,修改行可以使用行數區間
轉換命令y命令格式y/originchar/replacechar/,originchar和replacechar必須一一對應的,否則會報錯!
這個也比較簡單就不多說了。
從文件中讀取數據r上面我們提到向文件中輸出數據可以使用w,那么從文件中讀取數據可以用r,如下圖:
我們很輕松的就將
2.log
文件的數據讀了出來并且插入到了1.log
最后。r前面可以是行數也可以是文本匹配。
這里只是sed命令的一部分,還有很多其他的用法,后續有空我再接著寫!
另外,前端學習linux命令還是很有必要的,因為我們要經常使用node,它無論作為服務器還是工具都可以配合這些命令。
喜歡我的回答就關注我吧,有問題可以發表評論,我們一起學習,共同成長!
sed如何替換匹配的數字
志文件中其中一行內容為:abc135hello 想使用正則找到這一樣,分別使用命令egrep和sed。 問題1:數字匹配上\d是用來匹配數字的,使用\d+匹配不到135,但是必須用[0-9]才可以 問題2:egrep命令使用[0-9]+正則可以匹配到135,sed命令卻不行 [root@livedvdlog]#egrep"abcd[0-9]+hello"tmp.txt abcd135hello [root@livedvdlog]#egrep"abcd\d+hello"tmp.txt [root@livedvdlog]#sed-n'/abcd[0-9]+hello/p'tmp.txt [root@livedvdlog]#sed-n'/abcd\d+hello/p'tmp.txt [root@livedvdlog]# 后來嘗試單獨看看\d在sed中能匹配到什么,發現匹配到的是字母d而不是數字 [root@livedvdlog]#sed-n's/\d/AAAAAAAAAAAA/p'tmp.txt abcAAAAAAAAAAAA135hello [root@livedvdlog]#
正則表達式,任意字符
匹配任意字符[\s\S]*或者[\w\W]*正則表達式,又稱規則表達式。(英語:RegularExpression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex,復數有regexps、regexes、regexen。正則表達式是對字符串(包括普通字符(例如,a到z之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。正則表達式是一種文本模式,模式描述在搜索文本時要匹配的一個或多個字符串。
關于sed正則表達式替換的內容到此結束,希望對大家有所幫助。