- A+
5.参数
删除:d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[root@cheng ~]#cat passwd root:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/aofa:/sbin/nologin10 [root@cheng ~]#sed -r '3,$d' passwd //删除第三行到最后一行 root:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 [root@cheng ~]#sed -r '/root/d' passwd //删除带有root的行 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 |
替换:s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[root@cheng ~]#sed -r 's/root/aofa/' passwd //将root换为aofa,后加g全局,同vim aofa:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/aofa:/sbin/nologin10 [root@cheng ~]#sed -r 's/[0-9][0-9]$/&.5/' passwd //将两位数的数字后加.5 root:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10.5 |
读取:r
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@cheng ~]#sed -r '$r 1.txt' passwd //在最后一行读取新文件1.txt root:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 111111111 2222222 3333333333 |
写入:w
相当于另存为:
1 |
[root@cheng ~]#sed -r 'w 111.txt' 1.txt //把1.txt全部内容 写入111.txt |
追加:a
1 2 |
[root@cheng ~]#sed -r 'a123' passwd //每行后面,都加上123 [root@cheng ~]#sed -r '2a123' passwd //在第2行后面,加上123 |
插入:i
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@cheng ~]#sed -r '2iaaaaaaaa' passwd //在第二行插入新行aaaaaaaaaa root:x:0:0:root:/root:/bin/bash1 aaaaaaaa bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 |
取反:!
1 2 3 4 5 6 7 8 9 10 |
[root@cheng ~]#sed -r '2,$!d' passwd //不删除第2到最后一行(删12行) bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 |
多重命令:e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[root@cheng ~]#sed -r -e '1,3d' -e '4s/adm/admin/g' passwd //执行多条命令 admin:x:3:4:admin:/var/admin:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 [root@cheng ~]#sed -r '2s/bin/ding/g;2s/nologin/bash/' passwd //另一种方式同时执行多条命令 root:x:0:0:root:/root:/bin/bash1 ding:x:1:1:ding:/ding:/sding/bash2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 //#sed -r '2{s/bin/ding/g;s/nologin/bash/}' passwd //作用同上括号省了范围 |
替换整行:c
1 2 3 4 5 6 7 8 9 10 11 |
[root@cheng ~]#sed -r '2caaaaa' passwd //把第二行替换成aaaaaa root:x:0:0:root:/root:/bin/bash1 aaaaaaaa daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 |
获取下一条:n
1 2 3 4 5 6 7 8 9 10 11 |
[root@cheng ~]#sed -r '/root/{n;s/bin/ding/g}' passwd //{命令组合},找到root行,下一行查找替换 root:x:0:0:root:/root:/bin/bash1 ding:x:1:1:ding:/ding:/sding/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 |
6.暂存空间
1)图示
2)暂存和取用命令
h覆盖暂存空间,H追加暂存空间,g覆盖行,G追加行
3)示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
[root@cheng ~]#sed -r 'g' passwd //空白,g是将暂存空间内容覆盖到模式空间。 [root@cheng ~]#sed -r 'G' passwd //G是从暂存空间追加到模式空间。 [root@cheng ~]#sed -r '1h;$G' passwd //第一行覆盖到暂存空间;将暂存空间的内容追加到最后一行 [root@cheng ~]#sed -r '1h;2G;3G;$G' passwd //第一行覆盖到暂存空间,2后面多一行,3后面多一行, 10后面多一行 [root@cheng ~]#sed -r '1{h;d};$G' passwd //第一行进入暂存空间,第一行在模式空间中删除,将暂 存空间最佳到最后一行。就像移动。 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 root:x:0:0:root:/root:/bin/bash1 [root@cheng ~]#sed -r '1h;2,$g' passwd //第一行进入暂存空间;将暂存空间覆盖在,2到最后一行 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash1 [root@cheng ~]#sed -r '1h;2,3H;$G' passwd //第一行进入暂存空间;2,3行追加进攒存空间;将暂存的内容追加到最后一行 root:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 sync:x:5:0:sync:/sbin:/bin/sync6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 root:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 [root@cheng ~]#sed -r '4h;5x;6G' passwd //第四行进入暂存空间;将模式空间第五行和暂存空间互换,将暂存空间的内容追加到第六行。 root:x:0:0:root:/root:/bin/bash1 bin:x:1:1:bin:/bin:/sbin/nologin2 daemon:x:2:2:daemon:/sbin:/sbin/nologin3 adm:x:3:4:adm:/var/adm:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin4 sync:x:5:0:sync:/sbin:/bin/sync6 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7 halt:x:7:0:halt:/sbin:/sbin/halt8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9 operator:x:11:0:operator:/root:/sbin/nologin10 |
文本文件1.txt中包含字符串[:50]
1 2 |
~/Documents/books/linux/test$:cat 1.txt [:50] |
愿意想将[:50]替换为[50:100],脚本如下:
1 2 3 4 5 6 |
~/Documents/books/linux/test$:cat test.sh #!/bin/bash oldstr="[:50]" newstr="[50:100]" cat 1.txt | sed -n 's/$oldstr/$newstr/p' |
运行./test.sh,结果没有输出
1 2 |
~/Documents/books/linux/test$:./test.sh ~/Documents/books/linux/test$: |
于是,我上网查找问题原因,
1,如何在sed里使用变量的问题,发现原来是双引号和单引号引用的区别。
单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。
双引号:shell处理命令时,要对其中的内容进行算术扩展。如果想让shell扩展后得到sed命令所要的格式
下面是个简单的例子
1 2 3 4 5 |
~/Documents/books/linux/test$:name=chen ~/Documents/books/linux/test$:echo '$name' # $当作字符处理 $name ~/Documents/books/linux/test$:echo "$name" # $作为特殊字符处理 chen |
网上总结了四种方案
1. eval sed 's/$a/$b/' filename
2. sed "s/$a/$b/" filename
3. sed 's/'$a'/'$b'/' filename
4. sed s/$a/$b/ filename
于是我将脚本中sed中的单引号改为双引号。
1 2 3 4 5 |
#!/bin/bash oldstr="[:50]" newstr="[50:100]" cat 1.txt | sed -n "s/$oldstr/$newstr/p" |
但是输出的结果却跟预想的不一样。结果如下:
1 2 |
~/Documents/books/linux/test$:./test.sh [[50:100]50] |
仔细一下,应该跟sed中的正则表达式有关:
正则表达式认可的特殊字符有:
. * [ ] ^ $ { } \ + ? | ( )
这些特殊字符中的一个作为文本字符,需要在特殊字符前添加反斜杠字符\ 来转义它。
得到之前的结果是因为sed中的正则表达式[:50]表示第一个匹配: , 5,0任一字符用[50:100]进行替换。字符串[:50]第一个匹配的是:,所以得到[[50:100]50].所以我将oldstr中的[]进行转义,并且在sed命令选项中加上g进行完全替换。
1 2 3 4 5 |
#!/bin/bash oldstr="\[:50\]" newstr="[50:100]" cat 1.txt | sed -n "s/$oldstr/$newstr/g;p" |
则得到我想要的结果:
1 2 |
~/Documents/books/linux/test$:./test.sh [50:100] |
问题解决完毕。