1. 如何在一個文本文件中的每一行頭插入一個字符
2. 如何在一個文本文件中的每一行尾插入一個字符
html
3. 如何在一個文本文件中的每一行的指定列插入一串字符linux
1.awk '{print "X"$0}' urfile
正則表達式
2.awk '{print $0"X"}' urfile
3.awk '$O=$O" X"' urfilebash
sed全名叫stream editor,流編輯器(也叫行編輯器),其處理文本的方式爲一行一行的,不一樣於vi等全屏編輯器;主要用途爲經過匹配一個或多個正則表達式來對文本進行處理,實現過濾和轉換文本。編輯器
sed 的工做方式 ide
sed 實用工具按順序逐行將文件讀入到內存中。而後,它執行爲該行指定的全部操做,並在完成請求的修改以後將該行放回到內存中,以將其轉儲至終端。完成了這一行 上的全部操做以後,它讀取文件的下一行,而後重複該過程直到它完成該文件。如同前面所提到的,默認輸出是將每一行的內容輸出到屏幕上(特別要注意這點,所以通常要配合-n參數不讓其顯示不須要的)。在這裏,開始涉及到 兩個重要的因素—首先,輸出能夠被重定向到另外一文件中,以保存變化;第二,源文件(默認地)保持不被修改。sed 默認讀取整個文件並對其中的每一行進行修改。不過,能夠按須要將操做限制在指定的行上。工具
經過man命令查看sed幫助以下:spa
NAME
sed – stream editor for filtering and transforming textunixSYNOPSIS
sed [OPTION]… {script-only-if-no-other-script} [input-file]…orm
用便於理解的表示其用法以下:
sed [options] ‘AddressCommand’ file …
其中AddressCommand表示對須要處理的範圍(地址)執行的命令
-n: 靜默模式,再也不默認顯示模式空間中的內容
-i: 直接修改原文件
-e SCRIPT -e SCRIPT:能夠同時執行多個腳本
-f /PATH/TO/SED_SCRIPT
sed -f /path/to/scripts file
-r: 表示使用擴展正則表達式
-n:顯示出其餘資料行的默認操做,只顯示符合的數據行,以下面加-n選項和不加的顯示效果是不同的:
Address表示sed處理的範圍,如第20到30行、以root開頭的行等等。主要有以下幾種:
指定行:StartLine,EndLine
5,30 表示第5至30行
[root@localhost ~]# sed ‘5,30d’ /etc/passwd ##刪除5至30行內容(不會修改原文件)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
$ 表示最後一行
正則表達式匹配:/RegExp/
sed正則表達式的用法基本與grep同樣,如:
[root@localhost ~]# sed ‘/nologin$/d’ /etc/passwd ##刪除以nologin結尾的行
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
barlow:x:500:500::/home/barlow:/bin/bash
/pattern1/,/pattern2/
第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的全部行
指定具體的行:LineNumber
從某行開始及後面的多少行:addr1,+N
上面的5,30 等於5,+25
[root@localhost ~]# sed ‘5,+25d’ /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
在將Command以前,須要再次強調的是,Address和Command之間是直接相連的,中間沒有空格或者其餘符號。
Command主要有以下這些:
d: 刪除符合條件的行;參見前面Address部分的示例。
p: 顯示符合條件的行;須要注意的是,文章第二段紅字部分已經強調了,sed默認會把處理的文本一行行輸出到終端,所以直接用p命令看不出什麼效果。
a \string: 在指定的行後面追加新行,內容爲string,以下面的例子將在文本最後添加一行內容,注意cat看到結果與sed處理結果的差別:
\n:能夠用於換行
i \string: 在指定的行前面添加新行,內容爲string
r FILE: 將指定的文件的內容添加至符合條件的行處,如在fstab第二行後添加issue文件的內容
w FILE: 將地址指定的範圍內的行另存至指定的文件中;
s/pattern/string/修飾符: 查找並替換,默認只替換每行中第一次被模式匹配到的字符串
修飾符主要有:
g: 全局替換
i: 忽略字符大小寫
注意,替換命令的三個/能夠用其餘字符替換,如:
s@pattern@string@修飾符
s#pattern#string#修飾符
這些都是能夠的,只要三個分隔符同樣便可。
sed的查找替換功能參照我之前的博文:Linux下使用sed命令替換文件文件內容
&: 引用模式匹配整個串
[root@localhost ~]# sed ‘s/^[ ]*//g’ filename
[root@localhost ~]# sed ‘s/^ *//g’ filename
[root@localhost ~]# sed ‘s/^[[:space:]]*//g’ filename
行後:
[root@localhost ~]# sed ‘s/pattern/&\n/g’ filename
行前:
[root@localhost ~]# sed ‘s/pattern/\n&/g’ filename
注意:&表明pattern
[root@localhost ~]# sed -e 「s/$var1/$var2/g」 filename
sed -i ‘1 i\插入字符串’ filename
[root@localhost ~]# sed -i ‘$ a\插入字符串’ filename
[root@localhost ~]# sed -i ‘/pattern/ i 「插入字符串」‘ filename
[root@localhost ~]# sed -i ‘/pattern/ a 「插入字符串」‘ filename
[root@localhost ~]# grep -v ‘^#’ filename | sed ‘/^[[:space:]]*$/d’
[root@localhost ~]# df -P |sed -r ‘s/[[:space:]]+/:/g’
##-P 選項表示df輸出信息不自動換行
##[[:space:]]+匹配表示空格至少出現一次
1、sed (Stream Editor)
一、定位行:
sed -n '12,~3p' pass #從第12行開始,直到下一個3的倍數行(12-15行)
sed -n '12,+4p' pass #從第12行開始,連續4行(12-16行)
sed -n '12~3p' pass #從第12行開始,間隔3行輸出一次(12,15,18,21...)
sed -n '10,$p' pass #從第10行至結尾
sed -n '4!p' pass #除去第4行
二、正則:'/正則式/'
sed -n '/root/p' /etc/passwd
sed -n '/^root/p' /etc/passwd
sed -n '/bash$/p' /etc/passwd
sed -n '/ro.t/p' /etc/passwd
sed -n '/ro*/p' /etc/passwd
sed -n '/[ABC]/p' /etc/passwd
sed -n '/[A-Z]/p' /etc/passwd
sed -n '/[^ABC]/p' /etc/passwd
sed -n '/^[^ABC]/p' /etc/passwd
sed -n '/\<root/p' /etc/passwd
sed -n '/root\>/p' /etc/passwd
三、擴展正則:
sed -n '/root\|yerik/p' /etc/passwd #拓展正則須要轉義
sed -nr '/root|yerik/p' /etc/passwd #加-r參數支持拓展正則
sed -nr '/ro(ot|ye)rik/p' /etc/passwd #匹配rootrik和royerik單詞
sed -nr '/ro?t/p' /etc/passwd #?匹配0-1次前導字符
sed -nr '/ro+t/p' /etc/passwd #匹配1-n次前導字符
sed -nr '/ro{2}t/p' /etc/passwd #匹配2次前導字符
sed -nr '/ro{2,}t/p' /etc/passwd #匹配多於2次前導字符
sed -nr '/ro{2,4}t/p' /etc/passwd #匹配2-4次前導字符
sed -nr '/(root)*/p' /etc/passwd #匹配0-n次前導單詞
四、sed編輯(對行的插入、刪除、替換操做)
sed '/root/a admin' /etc/passwd #在root行後追加一個admin行
sed '/root/i admin' /etc/passwd #在root行前插入一個admin
sed '/root/c admin' /etc/passwd #將root行替換爲admin
sed '/root/d' /etc/passwd #刪除含有root的行
s替換
sed -n 's/root/admin/p' /etc/passwd
sed -n 's/root/admin/2p' /etc/passwd #在每行的第2個root做替換
sed -n 's/root/admin/gp' /etc/passwd
sed -n '1,10 s/root/admin/gp' /etc/passwd
sed -n 's/root/AAA&BBB/2p' /etc/passwd #將root替換成AAArootBBB,&做反向引用,代替前面的匹配項
sed -ne 's/root/AAA&BBB/' -ne 's/bash/AAA&BBB/p' /etc/passwd #-e將多個命令鏈接起來,將root或bash行做替換
sed -n 's/root/AAA&BBB/;s/bash/AAA&BBB/p' /etc/passwd #與上命令功能相同
sed -nr 's/(root)(.*)(bash)/\3\2\1/p' /etc/passwd #將root與bash位置替換,兩標記替換
或sed -n 's/\(root\)\(.*\)\(bash\)/\3\2\1/p' /etc/passwd
bash:x:0:0:root:/root:/bin/root
y替換
echo "sorry"|sed 'y/ory/ABC/' #一一對應替換(sABBC)
六、sed的模式空間和保持空間
h:模式---->保持
H:模式--->>保持
x:模式<--->保持
g:保持---->模式
G:保持--->>模式
例如:
111
222
333
444
# sed '1h;2,3H;4G'
分析
CMD 模式 保持
111 111 \n
1h 111 111
----------->111
222 222 111
2,3H 222 111\n222
----------->222
333 333 111\n222
2,3H 333 111\n222\n333
----------->333
444 444 111\n222\n333
4G 444\n111\n222\n333
----------->444\n111\n222\n333
1-10
11-22
22-33
11-22
34-END
七、sed特殊用法
sed -n '/root/w a.txt' #將匹配行輸出到文件
sed '/root/r abc.txt' /etc/passwd #把abc.txt的文件內容讀入到root匹配行後
sed -n '/root/w a.txt'
sed -n '/root/{=;p}' /etc/passwd #打印行號和匹配root的行
sed -n '/root/{n;d}' /etc/passwd #將匹配root行的下一行刪除
sed -n '/root/{N;d}' /etc/passwd #將匹配root行和下一行都刪除
sed '22{h;d};23,33{H;d};44G' pass
八、sed 腳本編寫方法
<1>從文件讀入命令
sed -f sed.sh
sed.sh文件內容:
s/root/yerik/p
s/bash/csh/p
<2>直接運行腳本 ./sed.sh /etc/passwd
#!/bib/sed -f
s/root/yerik/p
s/bash/csh/p
###################################
2、Sed練習
1,刪除文件每行的第一個字符。
sed -n 's/^.//gp' /etc/passwd
sed -nr 's/(.)(.*)/\2/p' /etc/passwd
2,刪除文件每行的第二個字符。
sed -nr 's/(.)(.)(.*)/\1\3/p' /etc/passwd
3,刪除文件每行的最後一個字符。
sed -nr 's/.$//p' /etc/passwd
sed -nr 's/(.*)(.)/\1/p' /etc/passwd
4,刪除文件每行的倒數第二個字符。
sed -nr 's/(.*)(.)(.)/\1\3/p' /etc/passwd
5,刪除文件每行的第二個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\2\3\5/p' /etc/passwd
6,刪除文件每行的倒數第二個單詞。
sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4\5\6/p' /etc/samba/smb.conf
7,刪除文件每行的最後一個單詞。
sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4/p' /etc/samba/smb.conf
8,交換每行的第一個字符和第二個字符。
sed -nr 's/(.)(.)(.*)/\2\1\3/p' /etc/passwd
9,交換每行的第一個單詞和第二個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/samba/smb.conf
10,交換每行的第一個單詞和最後一個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/passwd
11,刪除一個文件中全部的數字。
sed 's/[0-9]*//g' /etc/passwd
12,刪除每行開頭的全部空格。
sed -n 's/^\ *//p' /etc/samba/smb.conf
sed -nr 's/( *)(.*)/\2/p' testp
13,用製表符替換文件中出現的全部空格。
sed -n 's/\ /\t/gp' pass
14,把全部大寫字母用括號()括起來。
sed -nr 's/([A-Z])/(&)/gp' testp
sed -n 's/[A-Z]/(&)/gp' testp
15,打印每行3次。
sed 'p;p' pass
16,隔行刪除。
sed -n '1~2p' pass
17,把文件從第22行到第33行復制到第44行後面。
sed '1,21h;22h;23,33H;44G' pass
18,把文件從第22行到第33行移動到第44行後面。
sed '22{h;d};23,33{H;d};44G' pass
19,只顯示每行的第一個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)(.*)/\2/p' /etc/passwd
20,打印每行的第一個單詞和第三個單詞。
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\2--\4/p' /etc/passwd
21,將格式爲 mm/yy/dd 的日期格式換成 mm;yy;dd
date +%m/%Y/%d |sed -n 's#/#;#gp'
22, 逆向輸出cat a.txtABCDEFXYZ輸出樣式變成XYZDEFABC