sed正則經典案例(一)


**題目:已知目標文件如下**
<html>
<title>First Web</title>
<body>
h1Helloh1
h2Helloh2
h3Helloh3
</body>
</html>
請使文件中的內容輸出爲:
<h1>Hello<h1/>
<h2>Hello<h2/>
<h3>Hello<h3/>

創建環境

[root@oldboyedu36 ~]# cat >>html.txt<<EOF
> <html>
> <title>First Web</title>
> <body>
> h1Helloh1
> h2Helloh2
> h3Helloh3
> </body>
> </html>
> EOF
[root@oldboyedu36 ~]# cat html.txt
<html>
<title>First Web</title>
<body>
h1Helloh1
h2Helloh2
h3Helloh3
</body>
</html>

解題思路:sed替換+反向引用

方法一:
[root@oldboyedu36 ~]# sed -nr '4,6s#(..)(.*)(..)#<\1>\2</\3>#gp' html.txt
<h1>Hello</h1>
<h2>Hello</h2>
<h3>Hello</h3>
[root@oldboyedu36 ~]# sed -nr '4,6s#(h.)(.*)(h.)#<\1>\2</\3>#gp' html.txt
<h1>Hello</h1>
<h2>Hello</h2>
<h3>Hello</h3>
方法二:
[root@oldboyedu36 ~]# sed 's#h[1-9]#\<&\>#1' html.txt|sed 's#h[1-9]#\<&/\>#2'
<html>
<title>First Web</title>
<body>
<h1>Hello<h1/>
<h2>Hello<h2/>
<h3>Hello<h3/>
</body>
</html>
[root@oldboyedu36 ~]# sed -n '4,6s#h[1-9]#\<&\>#1p' 1.txt|sed 's#h[1-9]#\<&/\>#2'
<h1>Hello<h1/>
<h2>Hello<h2/>
<h3>Hello<h3/>
法三:終極版:
[root@oldboyedu36 ~]# sed -nr '{/h[1-9]/s##<&>#1;s#h[1-9]#<&/>#2p}' html.txt
<h1>Hello<h1/>
<h2>Hello<h2/>
<h3>Hello<h3/>
方法三:sed腳本
[root@oldboyedu36 ~]# vim html.sh 
/h[0-9]/{
 s//\<&\>/1
s//\<\/&\>/2
}
[root@oldboyedu36 ~]# cat html.sh 
/h[0-9]/{
 s//\<&\>/1
s//\<\/&\>/2
}
[root@oldboyedu36 ~]# sed -f html.sh 1.txt|sed -n '4,6p'
<h1>Hello</h1>
<h2>Hello</h2>
<h3>Hello</h3>

其他方法:
awk '/Hello/{printgensub(/^(h[0-9])(.*)(h[0-9])/,"<\\1>\\2</\\3>","G")}'html.txt

本題主要以sed的正則和擴展正則爲解題思路,其他方法:如awk中的gsub替換函數等,有興趣的可以自行嘗試。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章