Linux的Shell指令碼——day5——sed非互動文字編輯
cp 路徑/檔名{,.bak} == cp 路徑/檔名 路徑/檔名.bak 修改配置前做好備份
sed 前置命令 | sed [選項] '條件指令' 把前面的命令的輸出結果進行編輯操作 sed [選項] '條件指令' 檔案.. .. 對下面的檔案逐行處理
選項
-n | 遮蔽預設輸出,預設sed會輸出讀取文件的全部內容 |
-r | 讓sed支援擴充套件正則 |
-i | 使得sed直接修改原始檔,預設sed只是通過記憶體臨時修改檔案,對原始檔無影響 |
注意: 一般命令會有 -n 讓sed預設不讀取,而沒有 -i 讓sed的語句暫時不生效 一般是在命令進行過測試後,再加入 -i 使得命令生效
條件指令 注意:下面的所有例子,都是 sed 條件指令 檔案 中的條件指令,具體操作的時候要把sed和目標檔案寫上
條件
格式 | 作用 | 例子 | 解釋 |
行號 命令 | 對指定行號的行進行操作 | '3p' | 列印第三行 |
起始行號,終止行號 命令 | 對範圍中的幾行進行操作 | '2,6d' | 刪除第2行到第6行 |
行號1 命令 ; 行號2 命令; …… | 對多行進行操作,沒有行號先後區分 | '1p;2d' | 列印第一行然後刪除第二行 |
起始行號,+附加的行數 命令 | 從起始行號開始,再加指定行數,這寫範圍內的所有行進行操作 | '1,+3p' | 列印1到4行的內容 |
起始行號~步長 命令 | 從起始行號開始,每隔一個步長的每個行進行操作 | '1~2p' | 列印奇數行的內容 |
'2~2p' | 列印偶數行的內容 | ||
/正則表示式/命令 | 對匹配正則表示式的當進行操作,注意格式要求 | '/^\(root\)\|^\(ftp\)/d' | 刪除檔案中包以root或者ftp開頭的行 |
$命令 | 對最後一行進行操作 | '$!d' | 最後一行保留,其他全部幹掉 |
指令
命令 | 作用 | 用法及例子 | 解釋 |
i | 插入文字 | 條件 i 內容 | 在指定的行之前插入文字 |
a | 追加文字 | 條件 a 內容 | 在指定的行之後追加文字 |
c | 替換行 | 條件 c 內容 | 把指定行的內容替換,整行都替換掉 |
p | 列印 | 條件p | 列印符合條件的內容,注意如果沒有-n,sed預設列印所有 |
!p | 列印其他 | 條件!p | 不列印符合條件的內容,列印其他的所有 |
= | 列印行號 | '$=' | 輸出檔案一共多少行,$代表最後一行,=代表輸出行號 |
'/^root/=' | 輸出以root開頭的行號 | ||
d | 刪除 | 條件d | 刪除符合條件的內容 |
'$d' | 刪除最後一行 | ||
'/^$/d' | 刪除所有空行 ,這是正則與之結合的結果 | ||
!d | 保留其他 | 條件!d | 符合條件的不刪除,其餘刪除 |
'/^root/!d' | 以root開頭的保留,其餘全部刪除 | ||
s | 替換 | 條件 s/被替換內容/替換成什麼/第幾個 | 把檔案中的每個符合條件的行的第幾個匹配替換要求的內容進行替換,如果沒有這麼多個被替換內容就不替換,不寫預設第一個 |
條件 s/被替換內容/替換成什麼/g | 把檔案中的每個符合條件的行的所有匹配替換要求的內容進行替換 | ||
條件 s/被替換內容/替換成什麼/第幾個 p | 把檔案中的每個符合條件的行的第幾個匹配替換要求的內容進行替換,然後顯示,如果前面有-n,那麼就可以完成替換後只顯示替換的部分資訊 | ||
條件 s#被替換內容#替換成什麼# | s後面緊跟的符號就是控制替換符號,可以是任意字元,包括空格,字元,數字,但是不建議使用 | ||
'2s/student//2p' | 把檔案中第二行中第二個student替換成空,然後現實替換的內容,可以用作刪除 | ||
'1,5s/^a/#a' | 在1到5行每個以a開頭的行的前面加上註釋 | ||
'6,10s/^#//' | 把6到10行中的註釋的註釋標示去掉,讓其成為配置 | ||
'99s9\98\97\99\95\98\99gp' | 這裡面替換控制符號是9,他就算把99行所有的98979替換成95989然後輸出 | ||
'1s#^\(.\)\{'$n'\}\(.\)\(.*\)\(.\)\(.\)\{'$m'\}$#\1\4\3\2\5#' | 把第n個和倒數第m個字元對調 | ||
r | 匯入檔案 | 條件 r 檔案2 | 把檔案2(條件指令中的檔案)中的內容新增檔案1(sed命令後操作的檔案)中到滿足條件的行下 |
sed -n "2 r a.txt" b.txt | 把a.txt的內容新增到b.txt的第二行下 | ||
w | 匯出檔案 | 條件 w 檔案2 | 把檔案1(sed命令後操作的檔案)中到滿足條件的行另存到檔案2中 |
sed -n "w a.txt" b.txt | 把b.txt的所有內容儲存到a.txt中 | ||
H | 追加複製 | 條件 H | 把符合條件的行的內容寫入複製版中 |
h | 覆蓋複製 | 條件 h | 把符合條件的行的內容覆蓋寫入複製版中 |
G | 追加貼上 | 條件 G | 把複製版中的內容追加到符合條件的行後面,注意也沒有回車 |
g | 覆蓋貼上 | 條件 g | 把複製版中的內容覆蓋到符合條件的行後面,注意也沒有回車 |
例子:'2H;3h;5H;8G;9g' 一行一行的執行 邏輯理解: 對於HhGg可以理解為,一個複製版裡面本來就有一個回車,然後H是把內容追加寫入到複製版的下一行中,h是把內容覆蓋寫入到複製版中,G是對於當前行追加寫入複製版的內容,g是對於當前行進行覆蓋寫入 |
注意: 0. 在sed中的空格沒有太過嚴格的要求,條件與命令間有沒有空格都可以,不影響使用, 但是在用命令s進行替換的時候,每個空格都算是一個字元, s/被替換內容/替換成什麼/ 這以部分間不能隨便加空格,可以將其理解為一個整體 ,至於 第幾個、是否列印,他們間有空格無所謂。 1. 如果想讓輸出有該行在原始檔的位置,可以用 cat -n 檔案 | sed [選項] 條件 命令 但是這時候如果用正則匹配,開頭匹配就不能用了,因為內容有了改變,原本再檔案中開頭的資料前面都有了行號,他們就不是在行首了 2. 刪除某一行或多行用命令 '條件d' ,如果刪除某一行或多行中的某一些欄位用 '條件s/目標欄位//' 替換後一行的內容用'條件 c 內容' , 如果替換後一行中的某個欄位用'條件s/被替換的部分/替換成什麼/' 3. s後面緊跟的符號就是控制替換符號,可以是任意字元,包括空格,字元,數字,但是不建議使用 4. 在sed的s替換中替換成什麼,這個部分,符號基本都沒有特殊含義,除了 \ 和被選定作為控制替換符號 , 如果要向替換成 \ 就要打 \\ 如果向換成 \\ 就打 \\\ 依次類推 , 如果要替換成控制替換符號如 / 就要打 \/ 例如: sed -n 's/\([A-Z]\)/\/\\\1:"'/gp' 檔案 其作用就是把全文所有的大寫字母 變成 /\大寫字母:" 然後打印出來
5. 一般sed中用 ' ' 限定起來如果要用變數可以把中間的條件命令分開來 '……'$變數'……' 這樣就可以了
都是按照要求查詢一個檔案,然後根據分割符號進行去尾
for i in $( sed -n '/正則匹配/s/分割符號*//p' 檔名 )
do
echo $i
done
等同於
for i in $(grep '正則匹配' 檔名)
do
c=${i%%分割符號*}
echo $c
done