linux sed

1 sed -p

打印文本: sed -n 'p' test.txt 若是不加-n,則每行都重複。正則表達式

定位一行:3d

[root@iZryxshkbkz2x2Z ~]# sed -n '5p' test.txt 
	ddddddd root dafdadf

也能夠用正則匹配(使用正則時必定要用// 把正則表達式包裹起來):code

root@iZryxshkbkz2x2Z ~]#  nl test.txt | sed -n '/\(ddddddddd\)\+/p'
	dddddddddddrootfdaxcmkadfakdsmflakd

定位多行:blog

root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '2,4p'
	2	dddddddddddrootfdaxcmkadfakdsmflakd
	3	testfkdlkfaldkfl;akccccccccccccccccdadfac
	4	fdafacdfadsssssssssfdasfasfroot

用正則實現:不知道爲啥不行,明天看看字符串

取反:使用!io

[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '2,4!p'
	1	root 122222222222 dddddddaaa
	5	ddddddd root dafdadf

行間隔: first~step : 錯誤理解: 從first 行開始跳過step-1 行test

重點: 看結果理解。sed

[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '1~2p' # c
	1	root 122222222222 dddddddaaa  
	3	testfkdlkfaldkfl;akccccccccccccccccdadfac
	5	ddddddd root dafdadf

2 sed 行處理命令

2-1 -a (新增行,而不是在後面追加

在第一行和第二行後添加 '=======' [root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '1,2a=========='
1 root 122222222222 dddddddaaa ========== 2 dddddddddddrootfdaxcmkadfakdsmflakd ========== 3 testfkdlkfaldkfl;akccccccccccccccccdadfac 4 fdafacdfadsssssssssfdasfasfroot 5 ddddddd root dafdadf配置

2-2 -i(在xx行開頭插入一行)

[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2i==========' # 在第二行開頭插入===,至關於1a====
	1	root 122222222222 dddddddaaa
	==========
	2	dddddddddddrootfdaxcmkadfakdsmflakd
	3	testfkdlkfaldkfl;akccccccccccccccccdadfac
	4	fdafacdfadsssssssssfdasfasfroot
	5	ddddddd root dafdadf

2-3 -c 替代行

[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2c======'  # 用 ======= 替代第二行
	1	root 122222222222 dddddddaaa
	======
	3	testfkdlkfaldkfl;akccccccccccccccccdadfac
	4	fdafacdfadsssssssssfdasfasfroot
	5	ddddddd root da
	[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2,4c======'  # 替換多行
	1	root 122222222222 dddddddaaa
	======
	5	ddddddd root dafdadf

2-4 -d 刪除行

[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2d'
	1	root 122222222222 dddddddaaa
	3	testfkdlkfaldkfl;akccccccccccccccccdadfac
	4	fdafacdfadsssssssssfdasfasfroot
	5	ddddddd root dafdadf

2-5 案例

  1. 在配置文件後追加配置: sed '$a \ access no \n operration no' test.txt // $表明: 最後一行。 第一個斜槓表明間隔符,要不緊跟的空格不起做用。im

  2. 刪除文本中的空行:sed '/^$/d' test.txt [root@iZryxshkbkz2x2Z ~]# sed '/^$/d' test.txt

3 s 替換

3-1

  1. 注意s 替換與c 的區別,c 是替換行的。

  2. 替換字符串 和被替換字符串 記得先後加 /.

    [root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/' test.txt 
    root2 122222222222 dddddddaaa
    dddddddddddroot2fdaxcmkadfakdsmflakd
    testfkdlkfaldkfl;akccccccccccccccccdadfac
    fdafacdfadsssssssssfdasfasfroot2
    ddddddd root2 dafdadf

3-2 -g(全局替換)

g 參數表明全局參數,若是不加g 則只替換每一行的第一個匹配的

[root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/' test.txt 
	root2 rootaaaa2222222 dddddddaaa
	fdafacdfadsssssssssfdasfasfroot2
	root2dddddddrootdafdadfroot
	[root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/g' test.txt 
	root2 root2aaaa2222222 dddddddaaa
	fdafacdfadsssssssssfdasfasfroot2
	root2dddddddroot2dafdadfroot2

sed高級操做

一 第一節

1 {} : 多個sed 命令

場景: 實現間隔行(還能夠用first~step 實現): nl test.txt | sed -n '{n;p}':

[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '{n;p}'
	2	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
	4	bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
	6	ccccccccccccccccccccccccccccccc

nl test.txt | sed -n '{p;n}':

[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '{p;n}'
	1	root rootaaaa2222222 dddddddaaa
	3	fdafacdfadsssssssssfdasfasfroot
	5	rootdddddddrootdafdadfroot
	7	dddddddddddddddddddddddddd

2 -&:替換固定字符串

好比: sed '/root/&3/s' test.tet 等價於 sed 's/root/root3/' test.txt

[root@iZryxshkbkz2x2Z ~]# sed 's/root/&3/g' test.txt  # 等價於 sed 's/root/root3/g' test.txt
	root3 root3aaaa2222222 dddddddaaa
	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
	fdafacdfadsssssssssfdasfasfroot3
	bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
	root3dddddddroot3dafdadfroot3
	ccccccccccccccccccccccccccccccc
	dddddddddddddddddddddddddd

案例1: 在root 後添加冒號:

sed 's/root/& : /g' test.txt:

[root@iZryxshkbkz2x2Z ~]# sed 's/root/& : /g' test.txt
	root :  root : aaaa2222222 dddddddaaa
	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
	fdafacdfadsssssssssfdasfasfroot :
	bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
	root : dddddddroot : dafdadfroot :
	ccccccccccccccccccccccccccccccc
	dddddddddddddddddddddddddd

案例二: 將root 首字母轉爲大寫:

sed 's/root/\u&/g' test.txt

[root@iZryxshkbkz2x2Z ~]# sed 's/root/\u&/g' test.txt
	Root Rootaaaa2222222 dddddddaaa
	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
	fdafacdfadsssssssssfdasfasfRoot
	bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
	RootdddddddRootdafdadfRoot
	ccccccccccccccccccccccccccccccc
	dddddddddddddddddddddddddd

案例三: 將txt文件首字母轉換爲大寫:

ls *.txt | sed 's/\w+/\u&/'

[root@iZryxshkbkz2x2Z ~]# ls *.txt | sed 's/\w\+/\u&/'
	Ip.txt
	Test.txt

3 括號的使用

案例1: 提取passwd 中的用戶名,UID,GROUPID:

注意: .* :懶惰匹配

[root@iZryxshkbkz2x2Z ~]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\).*$/ \1 \2 \3/ ' passwd 
 root 0 0
 bin 1 1
 daemon 2 2
 adm 3 4
 lp 4 7
 sync 5 0
 shutdown 6 0
 halt 7 0

.* :懶惰匹配 \1 \2 \3 : 匹配的內容

** 案例2 **

提取ifconfig eth0 中的第二行

[root@iZryxshkbkz2x2Z ~]# ifconfig eth0 | sed -n '/inet/p' |sed 's/ine.r:([0-9.]+) .$/\1/'

4 讀(r) 和 寫(w)

把abc 的內容寫入 123.txt 內容的第一行。(abc.txt 和 123.txt 自己並無變化)

[root@iZryxshkbkz2x2Z ~]# sed '1r abc.txt' 123.txt 
	1111111111111
	aaaaaaa
	bbbbbbbbbbbbbbb
	cccccccccccccc
	222222222222
	33333333333333

把 123.txt 第一行的內容寫入abc.txt

[root@iZryxshkbkz2x2Z ~]# sed '1w abc.txt' 123.txt

5 q: 退出sed

相關文章
相關標籤/搜索