淺談sed

1.1 SED

1.1.1 sed是什麼 :全稱字符流編輯器Stream Edite

 

1.1.2 sed功能與版本:

1. 處理純文本文件、日誌、配置文件vim

2. 增刪改查bash

3. 查看sed版本:sed --versionapp

 

1.1.3 語法格式

1. sed  [選項]  [sed指令]  [輸入文件]編輯器

2. sed -i.bak 's#oldboy#oldbgirl#g' oldboy.txt3d

3. -i ---sed命令的參數日誌

4. s --sed指令orm

5. g ---就是個修飾blog

 

1.1.4 sed命令的實行過程  

1. 把內容讀取到內存中(模式空間)內存

2. 判斷是不是知足我要的條件(默認都會顯示到屏幕)it

3. 3. sed有個默認輸出因此不加-n,都會顯示到屏幕

4. 繼續讀取直到最後一行

 

1.1.5 sed經常使用功能

實驗環境:

[root@georgekai ~]# vim person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

 

實例1-1 查詢p(print)

1. 單行 - 行號

[root@georgekai ~]# sed -n '3p' person.txt

 

2. 找出包含oldboy的行

[root@georgekai ~]# sed -n '/oldboy/p' person.txt

注://中間能夠寫須要找的內容

 

3. 多行連續顯示(知道行號)

[root@georgekai ~]# sed -n '1,3p' person.txt

 

4. 多行連續顯示,顯示包含oldboy的行到包含yy的行(不知道行號,模糊查找)

[root@georgekai ~]# cat person.txt|sed -n '/oldboy/,/yy/p'

 

5. 顯示不連續的行

[root@georgekai ~]# nl person.txt |sed -n '1p;3p;4p'

注:sed或awk中,加多個命令,用分號分割(;)

 

實例1-2 增長

1. 在文件最後一行增長倆行

方法一:[root@georgekai ~]# echo -e "106,wuxingge,UFO\n107,lee,XO" >>person.txt

方法二:[root@georgekai ~]# nl person.txt |sed -n '$a 106,wixingge,UFO\n107,lee,XO.p'

    注:1. 這裏的$表示最後一行,a前面可加行號

      2. a === append追加,當前行的下一行追加

      3. i === insert插入,當前行的上一行插入

      4. 中間的\n ,表示回車鍵

方法三:[root@georgekai ~]# cat >> person.txt <<EOF

    EOF

 

實例1-3 刪除

1. 單行刪除

[root@georgekai ~]# nl person.txt |sed '1d' -i

2. 多行刪除

[root@georgekai ~]# cat person.txt |sed '/old/,/yy/d'

root@georgekai ~]# cat person.txt|sed '1d;3d;4d;5d'

 

2.不顯示文件的空行

方法一:[root@georgekai ~]# cat person.txt |grep -v '^$'

方法二:[root@georgekai ~]# cat person.txt |sed -n '/^$/!p'

注:!在sed中也是取反的意思

方法三:[root@georgekai ~]# cat person.txt |sed '/^$/d'

方法四:[root@georgekai ~]# cat person.txt |awk '!/^$/'

 

實例1-4 替換s

注:在「s###g」中遇到以#開頭的條件,3個#能夠用3個@代替

1. 不加小g,默認只替換每一行的第一個找到的條件

[root@georgekai ~]# sed 's#[1-9]#AAAA#' person.txt

注:後面加g,會替換每一行知足條件的全部

2. 備份

[root@georgekai ~]# sed -i.bak.$(date +%F) 'sg#old#boy#' person.txt

注:先備份源文件,在修改源文件的內容

3. sed中變量的使用

[root@georgekai ~]# x=oldboy

[root@georgekai ~]# y=oldgirl

[root@georgekai ~]# sed "s#$x#$y#g" person.txt

注:sed的使用變量須要用雙引號

 4. 單引號與雙引號區別

  [root@oldboyedu43-lnb oldboy]# echo 'I'am lee'

  > ^C

  [root@oldboyedu43-lnb oldboy]# echo "I'am lee"

  I'am lee

  [root@oldboyedu43-lnb oldboy]# echo 'I"am" lee'

  I"am" lee

 

實例1-5 反向引用(先保護,在使用)

 1. &符號的做用

  [root@georgekai ~]# echo '123456' |sed -r 's#.#<&>#g'

  <1><2><3><4><5><6>

  注:& 表示前倆個#號中間正則匹配到的全部內容

 2. 命令拼接,批量修改文件名稱

建立環境:

  [root@georgekai ~]# touch oldboy{01..10}.jpg

如何修改:

  方法一:[root@georgekai ~]# ls oldboy*.avi|sed -r 's#(.*).avi#mv & \1.jpg#g'|bash

    注:1.bash的做用,執行前面管道後輸出的內容

   2.& 表示前倆個#號中間正則匹配到的全部內容

   3.\1 表示前面()中的內容

 

方法二:把以txt結尾的文件,中的txt替換成jpg

  [root@georgekai ~]# rename txt jpg old*.txt

  [root@georgekai ~]# ls

  oldboy01.jpg  oldboy04.jpg  oldboy07.jpg  oldboy10.jpg

  oldboy02.jpg  oldboy05.jpg  oldboy08.jpg  person.txt

  oldboy03.jpg  oldboy06.jpg  oldboy09.jpg

格式

  rename     form          to             file

   要替換的源內容是什麼 替換成什麼內容 替換哪些文件

              jpg                      avi                       *.jpg

1.1.6 使用sed命令的常見問題

 1. -r與-i同時使用

  -ri (正常):先使用擴展正則,在修改文件內容

  -ir :先備份文件名爲「什麼什麼r」的備份文件,而後在替換源文件中的內容

 2. -i禁止與-n一塊兒使用

  如:sed -ni '1p' person.txt  會把源文件內容清空,只留下第一行

相關文章
相關標籤/搜索