作用
- sed命令是一個非交互式的行文本編輯器,它能對文件內容進行編輯,默認每次處理文本文件中所匹配到一行內容到模式空間,然后用后面的命令進行操作,操作完成之后,會把模式空間里面的內容輸出到屏幕上,然后把模式空間中的內容刪除,同時把下一行所匹配到的內容讀入模式空間內,依次循環,直到讀取完整個文件。
- sed 命令處理的是緩沖區中的內容,其實這里的緩沖區,就是模式空間
語法
sed語法支持兩種格式,分別是
- sed [options] 'address command' file
- sed [options] -f [scripefile] file
對以上的幾個英語字符進行說明:
- options為選項,其中sed支持的選項會在下面的選項小結說明
- address : 相當于匹配的條件,會在地址中進行說明
- command為命令,相當于一個參數,放在地址后面,具體見下面的命令小節說明
- file :為文本文件
需要說明的是,使用時address和command會挨在一起,中間沒有空格,上面語法中間加空格是為了說明這是兩個部分
以下為sed命令的工作流程圖
選項
這里的選項就是指sed之后的options,常見的選項具體如下:
-e ,--expression=script
以選項中指定的script參數來處理文本文件,可以指定多個命令
-f file,--files=script
以文件中的指定的參數來處理文本文件
?
-n ,--quiet ,--slient
取消默認輸出,sed默認會輸出所有文本內容,使用-n參數后只顯示處理過的行
?
-r ,--regexp-extended
支持擴展正則表達式
?
-i,--in-place[=SUFFIX]
直接修改文件內容
地址
這里的地址就是語法格式中的address部分,是在單引號里的前一部分 。
替換標記說明linenumber指定特定行號startline,endline指定起始行號和結束行號linenumber,+nn為數字,表示從指定行號向后n行/pattern/已正則表達式表示的匹配模式/pattern1, /pattern2/從模式匹配1到模式匹配2pattern/,x在給定行號上查詢包含模式的行x,/pattern/通過行號和模式查詢匹配的行x,y!查詢不包含指定行號x和y的行
命令
這里的指令就是command,這個一般放在單引號內,同時和要處理的字符放在一起,只是command放在字符的前面。
a 追加,向匹配行后面插入內容
i 插入,向匹配行前插入內容
c 更改,更改匹配行的內容
d 刪除,刪除匹配行的內容
s 使用替換模式替換相應模式
s/patten/newstring 替換,把patten匹配到的內容換成newstring
p 打印,打印出匹配的內容,通過與-n選項配合使用
= 標號,用來將匹配的行前標號
n 讀取下一行,遇到n會自動自動跳入下一行
r 將內容讀入文件
{} 命令間的傳遞,類似于管道符|
w 將匹配內容寫入文件
W 將匹配到行的第一行,保存到file中。
替換標記
- g : 表示將匹配到的內容進行全局替換 。
- 1 :表示前面第一個左括號所表示的內容 ,2表示前面第二個左括號中表示的內容,依次類推
- & : 表示前面匹配到的內容
正則匹配
正在匹配在上面已經介紹到,詳情請見正則表達式介紹。具體見:35個參數13個案例,全面解析Linux三劍客之grep命令
實例
以下主要針對地址指令的實戰練習
先準備數據文件aa.txt,通過cat查看aa.txt文件內容
[root@localhost test]# cat aa.txt
總用量 28
lrwxrwxrwx. 1 root root 7 9月 10 06:12 bin -> usr/bin
dr-xr-xr-x. 6 root root 4096 9月 10 06:44 boot
drwxr-xr-x. 20 root root 3360 9月 29 05:19 dev
drwxr-xr-x. 3 root root 20 9月 14 03:08 Docker_registry
drwxr-xr-x. 2 root root 41 9月 17 06:23 docker_study
drwxr-xr-x. 151 root root 12288 9月 29 05:20 etc
drwxr-xr-x. 3 root root 18 9月 10 06:57 home
lrwxrwxrwx. 1 root root 7 9月 10 06:12 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 9月 10 06:12 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 21 9月 19 21:51 mnt
drwxr-xr-x. 4 root root 34 9月 11 06:53 opt
dr-xr-xr-x. 307 root root 0 9月 29 05:19 proc
dr-xr-x---. 7 root root 266 9月 29 05:20 root
drwxr-xr-x. 45 root root 1320 9月 29 06:26 run
lrwxrwxrwx. 1 root root 8 9月 10 06:12 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 9月 29 05:19 sys
drwxr-xr-x. 3 root root 43 9月 26 19:11 test
drwxrwxrwt. 24 root root 4096 9月 29 06:38 tmp
drwxr-xr-x. 13 root root 155 9月 10 06:12 usr
drwxr-xr-x. 22 root root 4096 9月 10 06:45 var
- 顯示文件中的第2行內容 .
顯示文件中的第2行內容 .
- 刪除文件中3~13行
- 刪除匹配boot的行
- 刪除以d開頭的行
5.刪除包含d字符的行
6.打印匹配以d開頭到以l開頭的行(多次匹配)
7.打印dev到第5行,其中不包含第5行
8.打印第2行到匹配到dev之間的行
9.除3~16行之間的數據,將其它數據輸出
以下主要正則正則匹配的實戰練習
先準備數據文件,通過cat命令查看JAVA.conf文件
[root@localhost test]#
[root@localhost test]# cat java.conf
# System-wide Java configuration file -*- sh -*-
# Location of jar files on the system
JAVA_LIBDIR=/usr/share/java
# Location of arch-specific jar files on the system
JNI_LIBDIR=/usr/lib/java
# Root of all JVM installations
JVM_ROOT=/usr/lib/jvm
# You can define a system-wide JVM root here if you're not using the
# default one.
#
# If you have a base JRE package installed
# (e.g. java-1.6.0-openjdk):
#JAVA_HOME=$JVM_ROOT/jre
#
# If you have a devel JDK package installed
# (e.g. java-1.6.0-openjdk-devel):
#JAVA_HOME=$JVM_ROOT/java
# Options to pass to the java interpreter
#JAVACMD_OPTS=
# You can disable ABRT Java Connector by setting JAVA_ABRT to "off".
# See: https://github.com/jfilak/abrt-java-connector/
#JAVA_ABRT=off
[root@localhost test]#
- 過濾掉注釋的行,備注:注釋的行是以#開頭
- 過濾掉所有的空行
- 過濾掉所有注釋行和空行,此命令用到{},不清楚的可參考上面的命令
- 刪除掉所有注釋行和空行,(這里的刪除并非對源文件內容進行刪除)
- 匹配任何包含JVM的行
- 匹配包含JNI_LIBDIR或者JVM_ROOT的行
- 匹配任何包含數字的行
以下主要針對各命令的練習,如s,i,a,r,w,p等
- 將含有aaa字符的第一個字符a 替換成b.
- 將含有aaa的字符替換成bbb.
- 將JAVA_HOME替換成JAVA_DIR,注意,此文件包含多行JAVA_HOME
- 替換第二行內容中的root為test,注意是第一個匹配到的root字符。
- 替換第二,三行中的root為test,這次為全局替換
- 替換第二行到最后一行的root為test(全局替換)
- 在匹配See字符的行,行首添加hello
- 在匹配See字符的行,在See字符后添加hello
- 在匹配See字符的行,在See字符前添加hello
- 在匹配See字符的行,在行尾添加hello
- 在每一行的開頭添加hello 。
- 在每一行的結尾添加hello 。
13.在前三行的行首添加hello 。
- 在匹配ddd字符的行的前面一行添加hello
- 在匹配ddd字符的行的后面一行添加hello
- 在匹配的ddd行的下一行添加多行內容。
- 將一個新行添加到文件的第三行。
- 查詢boot的行是在第幾行
以上所有的替換或變化都不會改變原文件的內容 。
- 將文件info中的ccc修改為xyz。
- 將文件info中匹配到tmp的行,其中包含root的字符修改為test .
- 在匹配kkk的行的結尾添加end字符 。
- 直接替換文件中第三行的內容。
23.將指定文件abc.txt中的內容插入到info文件的第三行
- 將文件aa.txt中的前兩行輸出到文本文件abc.txt。
- 將aa.txt中匹配boot的行寫入到a1.txt中
- 讀取文件a.sh中的指令進行替換xxx為hello world .