1. 程式人生 > >sed--行編輯器命令

sed--行編輯器命令

col ber 輸出 刪除空白行 grub.conf 數據 文件 查找替換 文件編輯

sed:行編輯器,按行處理 默認不做原文件編輯,會在sed自身的緩存空間中按行讀相關的數據並完成編輯,然後顯示到屏幕上 1. 基本用法: sed [option]... ‘script‘ inputfile... script = ‘編輯位置+編輯命令‘ #註意:地址後面緊跟著編輯命令,中間沒空格 2. 常用選項:(sed後面跟的參數,比如sed -n...) -n:不輸出模式中的內容至屏幕; -e: 多點編輯; -f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本; -r: 支持使用擴展正則表達式;
-i: 原處編輯; 3. 編輯位置選定: (1) 不給位置:對全文進行處理; (2) 單位置: #: 指定的行,比如5表示第5行 /pattern/:被此處模式所能夠匹配到的每一行; (3) 位置範圍: #,# 比如3,5表示第3行到第5行 #,+# /pat1/,/pat2/ #,/pat1/ 表示從第幾行開始,到第一次被pat1匹配到的行結束 4. 編輯命令: d
刪除,例如刪除空白行sed ‘/^$/d‘ file;刪除文件最後一行sed ‘$d‘ file p 顯示模式空間中的內容 a \text:在行後面追加文本,text表示要加入的文本信息;支持使用\n實現多行追加;其中a和\之間有沒空格都可以,下面的同理 比如:sed ‘/^UUID/a \hello,world. \nwelcome‘ /etc/fstab---在以UUID開頭的行後面追加hello,world和 welcome兩行信息 i \
text:在行前面插入文本;支持使用\n實現多行插入; c \text:替換行為單行或多行文本為指定的信息,比如sed ‘/^UUID/c \hello,world. \nwelcome‘ /etc/fstab; w /path/to/somefile: 保存模式空間匹配到的行至指定文件中; 比如sed ‘/^UUID/w /tmp/fstab.txt‘ /etc/fstab, 把etc/fstab以UUID開頭的行,存到/tmp/fstab.txt中 r /path/from/somefile:讀取指定文件的文本流至模式空間中匹配到的行的行後; 例如:sed ‘6r /etc/issue‘ /etc/fstab----把/etc/issue中的內容寫到/etc/fstab文件的第6行後面 = 為模式空間中的行打印行號; sed ‘/^UUID/=‘ /etc/fstab 打印匹配到以UUID開頭的行號 ! 取反條件; 例如 sed ‘/^UUID/!d‘ /etc/fstab ---刪除不是以UUID開頭的行 s/// 支持使用其它分隔符,s@@@,s###;--查找替換; 例如:sed ‘s#^UUID#uuid#‘ /etc/fstab 替換標記: 1)g: 行內全局替換,比如sed ‘s/girl/girls/g‘ file ;會替換每一行的所有匹配 當需要從第N處匹配開始替換時,可以使用 /Ng
echo sksksksksksk | sed ‘s/sk/SK/2g‘ skSKSKSKSKSK echo sksksksksksk | sed ‘s/sk/SK/3g‘ skskSKSKSKSK 2)p: 顯示替換成功的行; 3)w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中; 例子: 1)刪除/boot/grub/grub.conf文件中所有以空白開頭的行行首的空白字符;(centos7) sed ‘s#^[[:space:]]\+##‘ /etc/grub2.cfg 2)刪除/etc/fstab文件中所有以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符; sed ‘s@^#[[:space:]]\+@@‘ /etc/fstab 3)在/etc/profile的最後一行附加兩行文本name=hong;intro=hello,$name,如果不想使變量生效,用單引號,想立刻生效用雙引號。 sed -i ‘$a\name=hong \nintro=hello,$name‘ /etc/profile 5. sed元字符集 ^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。 $ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。 . 匹配一個非換行符的任意字符,如:/s.d/匹配s後接一個任意字符,最後是d。 * 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。 [] 匹配一個指定範圍內的字符,如/[ss]ed/匹配sed和Sed。 [^] 匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。 & 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。 \< 匹配單詞的開始,如:/\<love/匹配包含love開頭的單詞的行
\> 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。 x\{m\} 重復字符x,m次,如:/0\{5\}/匹配包含5個0的行。 x\{m,\} 重復字符x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。 x\{m,n\} 重復字符x,至少m次,不多於n次,如:/0\{5,10\}/匹配5~10個0的行。 關於\(..\)的例子,這裏的\其實是轉義字符,默認sed不支持擴展正則表達式,如果用sed -r的話,轉義字符可省去 1) echo this is digit 7 in a number | sed ‘s#digit \([0-9]\)#\1#‘ this is 7 in a number 命令中 digit 7,被替換成了 7。樣式匹配到的子串是 7,\(..\) 用於匹配子串,對於匹配到的第一個子串就標記為 \1,依此類推匹配到的第二個結果就是 \2,例如:

2) echo aaa BBB | sed ‘s/\([a-z]\+\) \([A-Z]\+\)/\2 \1/‘ BBB aaa 3) love被標記為1,所有loveable會被替換成lovers,並打印出來:sed -n ‘s/\(love\)able/\1rs/p‘ file


關於&的例子 1)正則表達式 \w\+ 匹配每一個單詞,使用 [&] 替換它,& 對應於之前所匹配到的單詞:
echo this is a test line | sed ‘s/\w\+/[&]/g‘ [this] [is] [a] [test] [line] 2)所有以192.168.0.1開頭的行都會被替換成它自已加localhost:
sed ‘s/^192.168.0.1/&localhost/‘ file 192.168.0.1localhost


6. 高級編輯命令: h: 把模式空間中的內容覆蓋至保持空間中;(在模式空間中編輯,保持空間保存未編輯好的半成品數據,以便後面再處理) H:把模式空間中的內容追加至保持空間中; g: 從保持空間取出數據覆蓋至模式空間; G:從保持空間取出內容追加至模式空間; x: 把模式空間中的內容與保持空間中的內容進行互換; n: 讀取匹配到的行的下一行至模式空間;(模式空間中只有匹配行的下一行,覆蓋了匹配到的行) N:追加匹配到的行的下一行至模式空間;(有2行) d: 刪除模式空間中的單行; D:刪除模式空間中的所有行; 幾個例子: sed -n ‘n;p‘ FILE:顯示偶數行 ---多個處理命令用分號隔開 sed ‘1!G;h;$!d‘ FILE:逆向顯示文件內容----- 理解:1!表示第一行除外,$表示最後一行,!$表示除了最後一行,每一行都要執行這3個命令,然後才處理下一行,sed會首先讀取一行到模式空間,然後執行這3個命令 sed ‘$!N;$!D‘ FILE: 取出文件後兩行; sed ‘$!d‘ FILE:取出文件最後一行; sed ‘G‘ FILE: 每一行後面追加一個空白行 sed ‘/^$/d;G‘ FILE: 如果是空白行,刪掉,在後面再加一個空白行;表示把多個空白行合並為1個 sed ‘n;d‘ FILE: 顯示奇數行; sed -n ‘1!G;h;$p‘ FILE: 逆向顯示文件中的每一行;

sed--行編輯器命令