處理文件的工具sed Stream EDitor, 行編輯器 一次只讀一行,只處理一行,不對源文件做處理,至輸出到屏幕上模式空間 sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space), 接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。 文件內容并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等 用法: sed[option]... 'script' inputfile... 常用選項: -n: 靜默模式,不輸出模式空間中的內容; -n, --quiet, --silent suppress automatic printing of pattern space -r: 擴展的正則表達式 -r, --regexp-extended use extended regular expressions in the script. -f /path/to/sed_script_file: 指定sed腳本文件 -f script-file, --file=script-file add the contents of script-file to the commands to be executed -e 'script' -e 'script': 指定多個編輯指令 -e script, --expression=script add the script to the commands to be executed -i: 直接編輯原文件 edit files in place script: '地址命令' 編輯命令: d: 刪除 p: 打印 i \text: \n 換行符 行前面插入文本 a \text: \n 換行符 行下面插入文本 r /path/to/somefile: 在指定位置把另外一個文件的內容插入進來 w /path/to/somefile:將符合條件的所有行保存至指定的文件中 =:顯示符合條件的行的行號 s///: 查找條件可以使用模式,但要替換的內容不行 ///可以替換為@@@或者###或者$$$ g:行內全局替換 p:顯示替換成功的行 w /path/to/somefile:將替換成功的行保存至文件中 !:模式空間中匹配行取反處理 地址定界 (1) 不給地址:對全文進行處理 (2) 單地址: #: 指定的行 /pattern/:被此處模式所能夠匹配到的每一行 (3) 地址范圍: #,# #,+# /pat1/,/pat2/ #,/pat1/ (4) ~:步進 1~2 奇數行 2~2 偶數行 用法 #sed [options] 'addr1[,addr2]編輯命令' FILE ... #sed [options] “addr1[,addr2]編輯命令” FILE ...
[root@centos7 tmp]# cat f1 /etc/passwd | head -5 1 root:x:0:0:Sxj,001,002,003:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@centos7 tmp]# sed '2p' f1 | head -5 ###2p 即打印第二行 1 root:x:0:0:Sxj,001,002,003:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 tmp]# sed -n '2p' f1 ###-n 不輸出模式空間中的內容;注意看和上面的區別 2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@centos7 tmp]# sed -n '1,4p' f1 1 root:x:0:0:Sxj,001,002,003:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 tmp]# sed -n '/root/p' f1 ###包含root字符串的行輸出出來 1 root:x:0:0:Sxj,001,002,003:/root:/bin/bash 10 operator:x:11:0:operator:/root:/sbin/nologin 49 rooter:x:0:5009::/home/rooter:/bin/bash
[root@centos7 tmp]# cat -n f2 1 1 2 3 2 4 5 6 3 7 [root@centos7 tmp]# sed -n '/^$/=' f2 ###輸出空行的行號 結合上面的cat命令可以看出效果 2 4 5 7 [root@centos7 tmp]# sed -n -e '/^$/p' -e '/^$/=' f2 ###-e指定多個編輯命令 2 4 5 7
[root@centos7 tmp]# sed '/^$/d' f2 1 2 3
[root@centos7 tmp]# sed '1,10d' f1 | head -5 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 nobody:x:99:99:Nobody:/:/sbin/nologin 14 systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin 15 systemd-network:x:998:997:systemd Network Management:/:/sbin/nologin
[root@centos7 tmp]# sed -n 's/root/&superman/p' /etc/passwd rootsuperman:x:0:0:Sxj,001,002,003:/root:/bin/bash operator:x:11:0:operator:/rootsuperman:/sbin/nologin rootsupermaner:x:0:5009::/home/rooter:/bin/bash
[root@centos7 tmp]# sed -i.bak 's/root/superman/g' f1 ###會直接修改文件f1 同時生成備份文件f1.bak f1.bak為修改前的內容
[root@centos7 tmp]# cat /etc/fstab | sed -e 's@UUID@ABC@g' -e 's@ABC@DEF@g' ### DEF=174a1f45-937a-4844-9650-27550836880d / ext4 defaults 1 1 DEF=a9778fb4-3adb-471b-96ff-571d2325ee3c /boot ext4 defaults 1 2 DEF=fb15ae62-3c30-4cbb-9d4e-a0e3e2531e8c /testdir ext4 defaults 1 2 DEF=ba38f744-eb07-4306-b0a0-9b58a9ba81f2 swap swap defaults 0 0 [root@centos7 tmp]# cat /etc/fstab | sed -e 's@UUID@ABC@g' -e 's@UUID@DEF@g' ###和上一個做比較,可以看出第二個-e后的編輯命令是處理第一個-e處理之后的結果 ABC=174a1f45-937a-4844-9650-27550836880d / ext4 defaults 1 1 ABC=a9778fb4-3adb-471b-96ff-571d2325ee3c /boot ext4 defaults 1 2 ABC=fb15ae62-3c30-4cbb-9d4e-a0e3e2531e8c /testdir ext4 defaults 1 2 ABC=ba38f744-eb07-4306-b0a0-9b58a9ba81f2 swap swap defaults 0 0
高級編輯命令: h: 把模式空間中的內容覆蓋至保持空間中 H:把模式空間中的內容追加至保持空間中 g: 從保持空間取出數據覆蓋至模式空間 G:從保持空間取出內容追加至模式空間 x: 把模式空間中的內容與保持空間中的內容進行互換 n: 讀取匹配到的行的下一行覆蓋至模式空間 N:追加匹配到的行的下一行至模式空間 d: 刪除模式空間中的行 D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出), 放棄之后的命令,但是對剩余模式空間重新執行sed
下面用幾個實例來說明sed的高級用法:
# sed -n 'n;p' /etc/fstab 顯示偶數行 # sed '1!G;h;$!d' FILE 逆序顯示文件內容 # sed '$!d' FILE 取出最后一行 # sed '$!N;$!D' FILE 取出文件后兩行; # sed '/^$/d;G' FILE 刪除原有的所有空白行,而后為所有非空白行添加一個空白行 # sed 'n;d' FILE 顯示奇數行 # sed 'G' FILE 在原有的每行后方添加一個空白行
原創文章,作者:sixijie,如若轉載,請注明出處:http://www.www58058.com/32147