字符串的初值 正则表达式 sed应用

2024-04-02 15:32

本文主要是介绍字符串的初值 正则表达式 sed应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

字符串的初值(备用值)

正则表达式

基础正则列表 

扩展正则列表

基本正则: 

 扩展正则egrep:

基本元字符

{}限定次数 

其他元字符

整体及边界匹配

sed基本用法

sed命令

命令格式

常见的命令选项

常用动作指令

 输出文本

删除文本

替换文本

如何把/bin/bash换成/sbin/sh?

sed替换应用

编写脚本,搭建ftp服务,并且实现匿名上传功能

sed的文本块处理动作

a行后追加练习

i行前追加练习

c替换练习

sed高级应用

导入导出操作

!取反操作

sed综合脚本应用



字符串的初值(备用值)

  • 使用${}表达式,格式:  ${变量名:-(备用值)}      变量为非空值时不能使用
[root@server0 ~]# vim 01.sh
#!/bin/bash
read -p "请输入用户名  " m
useradd  $m
read -p  "请输入密码"  p                        #用户不输入密码直接回车时使用
echo  ${p:-123456}  |  passwd  --stdin  $m     #123456作为用户的密码
[root@server0 ~]# bash 01.sh
请输入用户名  hsjdh
请输入密码   
更改用户 hsjdh 的密码 。
passwd:所有的身份验证令牌已经成功更新。


正则表达式

可以配合某工具对文档进行过滤筛选

  • 基础正则列表 

正则符号描述
^匹配行首
$匹配行尾
[ ]集合,匹配集合中任意单个字符
[ ^ ]对集合进行取反
.匹配任意单个字符
*匹配前一个字符任意次数     (*不允许单独使用)
\{n,m\}匹配前一个字符n到m次
\{n\}

                                                                          匹配前一个字符n次

\{n,\}匹配前一个字符n次及以上
\( \ )保留,组合成一个整体
  • 扩展正则列表

正则符号描述
+最少匹配一次
?最多匹配行首
{n,m}匹配n到m次
( ) 组合为整体,保留,相当于复制
|或者
\b单词边界

 

准备素材: 

[root@server0 ~]# head  -5  /etc/passwd  > user
[root@server0 ~]# cat user
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

基本正则: 

[root@server0 ~]# head -5 /etc/passwd > /mnt/test   ##以test为素材
[root@server0 ~]# cat test
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# grep root test   ##查找有root的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep ^root test   ##查找以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep bash$ test   ##查找以bash结尾的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep "[ro]" test   ##查找字母r或者o的行
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@server0 ~]# grep "[a-z]" test   ##查找所有小写字母
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# grep "[A-Z]" test    ##查找所有大写字母 素材内无大写所以无匹配.
[root@server0 ~]# grep "[0-9]" test    ##查找所有数字
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# grep "[a-Z]" test      ##查找所有字母
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# grep "[^ro]" test     ##查找r或者o之外的内容
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# grep "[^0-9]" test      ##查找数字之外的内容
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 

[root@server0 ~]# vim  test          ##给test文件添加几行,包括空格及空行
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
rt
rot
roooooooot
rooot[root@server0 ~]# grep  "." test   ##查找任意字符,发现空格也匹配
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
rt
rot
roooooooot
rooot[root@server0 ~]# grep  ".*" test  ##查找任意字符,发现空格及空行也匹配
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
rt
rot
roooooooot
rooot[root@server0 ~]# grep  "roo." test   ##找root后面任意1个字符的行
root:x:0:0:root:/root:/bin/bash
roooooooot
rooot
[root@server0 ~]# grep  "ro.." test   ##找ro后面任意2个字符的行
root:x:0:0:root:/root:/bin/bash
roooooooot
rooot
[root@server0 ~]# grep  "r..." test   ##找r后面任意3个字符的行
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
roooooooot
rooot
[root@server0 ~]# grep "ro*t" test    ##查找rot,其中字母o可以出现任意次,零次也行
root:x:0:0:root:/root:/bin/bash
rt
rot
roooooooot
rooot
[root@server0 ~]# grep "ro\{1,2\}t" test  ##o出现了1~2次
root:x:0:0:root:/root:/bin/bash
rot
[root@server0 ~]# grep "ro\{3,5\}t" test  ##o出现了3~5次
rooot
[root@server0 ~]# grep "ro\{3,8\}t" test  ##出现了3~8次
rooooooooto
rooot
[root@server0 ~]# grep "ro\{1,8\}t" test   ##出现了1~8次
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# grep "ro\{2\}t" test   ##o出现了2次
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep "ro\{2,\}t" test  ##o出现了2次及3次以上
root:x:0:0:root:/root:/bin/bash
roooooooot
rooot
[root@server0 ~]# grep "ro\{3,\}t" test   ##o出现了3次及3次以上
roooooooot
rooot
[root@server0 ~]# grep  "\(0:\)\{2\}" test  ##查找0:0:
root:x:0:0:root:/root:/bin/bash

 扩展正则egrep:

  • 文本处理顺序:
  1. 以行为单位,逐行进行处理
  2. 默认只输出与表达式相匹配的文本行
  • 基本用法:   等同于grep  -E ,表示允许使用扩展的正则表达式
  1. 格式1:egrep   [选项]   "正则表达式"   文件...
  2. 格式2:  前置命令  | egrep   [选项]   "正则表达式"
常用选项作用
-i忽略字母大小写
-v条件取反
-c统计匹配的行数
-q静默,无任何输出,一般用于检测
-n显示出匹配结果所在的行号
--color标红显示匹配字串

基本元字符

类型 含义示例说明

 
匹配行首^abc以abc开头的行
^#  以#开头的行(比如注释行)
$
 
匹配行尾abc$以abc结尾的行
^$空行
.单个字符.  除换行符(\n)以外的任意单个字符

 
最少匹配一次a+  一个或多个连续的a

    (abc)+           

一个或多个连续的abc
 ?      
 
最多匹配一次   a?    

                                                 0个或1个a

(abc)?0个或1个abc
*匹配任意次数a* 0个或多个连续的a
(abc)* 0个或多个连续的abc
*  任意长度的任意字符串

{}限定次数 

类型含义示例说明
{n}匹配n次(ab){3}匹配ababab
{n,m}匹配n-m次(ab){1,3}匹配ab,abab,ababab
{n,}匹配至少n次(ab){2,}匹配2个及以上连续的ab

其他元字符

示例 说明
[alc45_?]匹配a,l,c,4,5,_,?
[a-z]匹配任意小写字母
[A-Z]匹配任意大写字母
[0-9]匹配任意数字
[a-Z0-9]匹配任意字母或数字
[^A-Z]匹配包括非大写字母的行
^[^a-z]匹配不以小写字母开头的行

整体及边界匹配

类型含义示例说明
()组合为整体ab{1,3}匹配ab,abb,abbb
(ab){1,3}匹配ab,abab,ababab
|或者root|bin

                                           匹配root|bin

\b单词边界\broot\b匹配单词root,不匹配keroot,rooty等字符串
\<单词的开头\<th匹配以th开头的单词
\>单词的结束\<root\>作用与\broot\b相同
\w字母数字下划线\wa匹配xa,不匹配#a
\s匹配空白\sa匹配  a,不匹配xa
\d匹配数字-P \da匹配n(数字)a,不匹配xa
[root@server0 ~]# grep "\(0:\)\{2\}" test  ##查找0:0:两次
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep "ro\{2\}t" test      ##查找前一个字符出现2次
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# grep -E "ro{2}t" test   ##效果同上
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# egrep  "ro{2}t" test    ##效果同上
root:x:0:0:root:/root:/bin/bash 
[root@server0 ~]# egrep  "ro{1,3}t" test   ##查找rot,其中o可以出现1次到3次
root:x:0:0:root:/root:/bin/bash
rot
rooot
[root@server0 ~]# grep  "ro\{1,\}t" test   ##查找rot,其中o可以出现1次及1次以上
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# egrep  "ro{1,}t" test   ##效果同上
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# egrep  "ro+t" test   ##查找rot其中o最少可以出现1次
root:x:0:0:root:/root:/bin/bash
rot
roooooooot
rooot
[root@server0 ~]# grep  "ro\{0,1\}t" test   ##查找rot,其中o可以出现0次到1次
rt
rot
[root@server0 ~# egrep  "ro{0,1}t" test   ##效果同上
rt
rot
[root@server0 ~# egrep  "ro?t" test   ##查找rot,其中o可以出现1次或0次
rt
rot
[root@server0 ~]# egrep "root|bin" test  ##查找有root或者bin的行
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# egrep "^root|^bin" test     ##查找以root开头或者以bin开头的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@server0 ~]# egrep "^(root|bin)" test   ##效果同上
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@pserver0 ~]# vim abc   ##以ABC作为素材
the
1the
$the*
_thea
[root@server0 ~]# grep "the" abc   ##找有the的行
the
1the
$the*
_thea
[root@server0 ~]# grep "the\b" abc  ##找有the且右边不能是字母数字下划线
the
1the
$the*
[root@server0 ~]# grep "\bthe\b" abc  ##找有the且两边不能是字母数字下划线
the
$the*
[root@server0 ~]# grep "\bthe" abc  ##找有the且左边不能是字母数字下划线
the
$the*


sed基本用法

sed命令

sed,流式编辑器

  • 非交互,基于模式匹配过滤文件及修改文本
  • 逐行处理,并将结果输出到屏幕
  • 可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作

命令格式

  • 格式一:前置命令   |  sed  选项   (定址符)指令
  • 格式二: sed     选项    (定址符)指令    被处理的文件

常见的命令选项

-n屏蔽默认输出(全部文本)
-i直接修改文件内容,对文件进行实际操作
-r启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
-e指定需要执行的-e指令,支持使用多个-e参数
-f指定需要执行的脚本文件,需要提前将sed指令写入文件中

条件,可以使行号或/正则/

行号可以使用单个数字表示单行

或者n,m表示连续的多行

省略条件,正则默认逐行处理全部文本

匹配正则时,则需要使用//

常用动作指令

替换操作的分隔"/"可改用其他字符,如#.&等,便于修改文件路径

操作符用途指令示例
p打印行2,4p    输出2 3 4 行
2p;4p   输出第2  4 行
d删除行2,4d     删除第2 3 4 行
s字符串替换s/old/new/   将每行的第一个old替换为new
s/old/new/3   将每行的第三个old替换为new
s/old/new/g    将所有的old都替换为new

 输出文本

[root@server0 ~]# cat test   ##以test文件作为素材
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed 'p' test    ##输出+默认输出,所以是每行出现2次
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed -n 'p' test   ## 输出全文
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed -n '1p' test  ##输出第一行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# sed -n '2p' test  ##输出第二行
bin:x:1:1:bin:/bin:/sbin/nologin
[root@server0 ~]# sed -n '3p' test   ##输出第三行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '1,3p' test  ##输出1-3行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '1p;3p' test  ##输出第1行和第3行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '1,+2p'  test  ##输出第1行以及后面2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server0 ~]# sed -n '3,+1p'  test   ##输出第3行以及后面1行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@server0 ~]# sed -n '1~2p'  test   ##输出奇数行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed -n '2~2p'  test   ##输出偶数行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@server0 ~]# sed -n '/root/p'  test  ##输出有root的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# sed -n '/^root/p'  test  ##输出以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# free | sed -n '2p'   ##输出free指令生成的文档的第2行
Mem:        1446924       70232     1108292        8608      268400     1211636
[root@server0 ~]# sed -rn '/root|bin/p'  test  ##输出有root或者有bin的行
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed -n '$=' test   ##统计输出全文最后1行行号
5

删除文本

[root@server0 ~]# sed 'd' test   ##删除全文
[root@server0 ~]# sed '1d' test  ##删除第1行,显示剩余行
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '2d' test     ##删除第2行,
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '5d' test      ##删除第5行
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
[root@server0 ~]# sed '1,3d' test     ##删除1-3行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '3,+2d' test     ##删除第3行以及后面2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@server0 ~]# sed '/bash$/d' test   ##删除以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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '1d;3d' test      ##删除第1行和第3行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '1~2d' test      ##删除奇数行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@server0 ~]# sed '2~2d' test      ##删除偶数行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0 ~]# sed '$d' test    ##删除全文最后1行
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
[root@server0 ~]# sed '/var/!d' test    ##不删除有var的行
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

替换文本

[root@server0 ~]# vim hihi  ##以hihi作为素材
2017 2011 2018
2017 2017 2024
2017 2017 2017
[root@server0 ~]# sed 's/2017/xxxx/' hihi  ##将所有行的第1个2017替换成xxxx
xxxx 2011 2018
xxxx 2017 2024
xxxx 2017 2017
[root@server0 ~]# sed 's/2017/xxxx/2' hihi  ##将全文的第2列的2017替换成xxxx
2017 2011 2018
2017 xxxx 2024
2017 xxxx 2017
[root@server0 ~]# sed 's/2017/xxxx/g' hihi  ##将全文的2017替换成xxxx
xxxx 2011 2018
xxxx xxxx 2024
xxxx xxxx xxxx
[root@server0 ~]# sed '2s/2017/xxxx/' hihi  ##将第2行的第1个2017替换成xxxx
2017 2011 2018
xxxx 2017 2024
2017 2017 2017
[root@server0 ~]# sed '3s/2017/xxxx/2' hihi  ##将第3行的第2个2017替换成xxxx
2017 2011 2018
2017 2017 2024
2017 xxxx 2017
[root@server0 ~]# sed '3s/2017//2' hihi   ##潜在的删除功能,将第3行的第2个2017替换成空
2017 2011 2018
2017 2017 2024
2017 2017
[root@server0 ~]# sed 's/2024/xxxx/p' hihi  ##将所有行的2024替换成xxxx
2017 2011 2018
2017 2017 xxxx
2017 2017 xxxx
2017 2017 2017

如何把/bin/bash换成/sbin/sh?

[root@server0 ~]# cat test  ##以test作为素材
root:x:0:0:root:/root:/bin/bash
[root@server0 ~]# sed  's/\/bin\/bash/\/sbin\/sh/'   test  ##正常替换,繁琐
root:x:0:0:root:/root:/sbin/sh
[root@server0 ~]# sed   's#/bin/bash#/sbin/sh#'    test   ##修改替换符,简洁
root:x:0:0:root:/root:/sbin/sh 


sed替换应用

创建素材文件:nssw.txt

[root@server0 ~]# vim nssw.txt
Hello the world
ni ha4o ma beijing

删除文件中每行的第二个,最后一个字符

[root@server0 ~]# sed 's/.//2;s/.$//' nssw.txt 
hllo the world
n hao ma beijin

将文件中每行的第一个,倒数第一个字符互换

[root@server0 ~]# sed -r 's/^(.)(.*)(.)$/\3\2\1/'  nssw.txt 
dello the worlh
gi hao ma beijinn

删除文件中的数字

[root@server0 ~]# sed  -i 's/[0-9]//g'  nssw.txt 
hello the world
ni hao ma beijing

为文件中每个大写字母添加括号

[root@server0 ~]# sed -r  's/([A-Z])/{\1}/g' nssw.txt 
{H}ello t{H}e world
ni hao {M}a bei{J}ing
[root@server0 ~]# sed -r  's/([A-Z])/[\1]/g' nssw.txt 
[H]ello t[H]e world
ni hao [M]a bei[J]ing
[root@server0 ~]# sed -r  's/([A-Z])/(\1)/g' nssw.txt 
(H)ello t(H)e world
ni hao (M)a bei(J)ing

编写脚本,搭建ftp服务,并且实现匿名上传功能

测试:在真机上连接ftp://172.25.0.11进入pub目录,注意selinux和防火墙的影响!!!!!!!!!!!!!!!!!!!!!!!

[root@server0~]# vim test03.sh
#!/bin/bash
#这是一个简单的ftp服务
if [ "$USER" != "root" ];then
echo "你不是管理员,没有权限哦!"
exit 2
fi
rpm -q vsftpd
if [ $? -ne 0 ];then
yum -y install vsftpd  &> /dev/null 
sed -i '/^#anon_upl/s/#//'  /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
systemctl enable  vsftpd  &> /dev/null
chmod 777 /var/ftp/pub
#setenforce 0               ##安装有防火墙就需要这2行
#systemctl stop  firewalld   
else
echo "请稍等..."
sed -i '/^#anon_upl/s/#//'  /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
systemctl enable  vsftpd  &> /dev/null
chmod 777 /var/ftp/pub
#setenforce 0               ##安装有防火墙就需要这2行
#systemctl stop  firewalld   
fi

sed的文本块处理动作

操作符用途指令示例
i
 
行前插入文本2iYY     在第二行之前添加文本行"YY"
4,7iYY   在第4-7行的每一行前添加文本行
a
 
行后插入文本2aYY      在第二行之后添加文本
/^XX/aYY   在以XX开头的行之后添加文本
c替换当前行2cYY      将第二行的内容修改为"YY"

处理多行文本:修改后的文本有多行时

  • 以换行符 \n 分隔
  • 或者,使用 \ 强制换行 

a行后追加练习

[root@server0 ~]# cat user                         #准备素材
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@server0 ~]# sed '1a XXXX' user               #第一行下追加字母
root:x:0:0:root:/root:/bin/bash
XXXX
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@server0 ~]# sed '1,3a XXXX' user             #第1-3行下都追加字母
root:x:0:0:root:/root:/bin/bash
XXXX
bin:x:1:1:bin:/bin:/sbin/nologin
XXXX
daemon:x:2:2:daemon:/sbin:/sbin/nologin
XXXX
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@server0 ~]# sed '1,+1a XXXX' user             #第一行以及后面的一行追加字母
root:x:0:0:root:/root:/bin/bash
XXXX
bin:x:1:1:bin:/bin:/sbin/nologin
XXXX
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@server0 ~]# sed '/root/a XXXX' user           #有root的行下追加
root:x:0:0:root:/root:/bin/bash
XXXX
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

i行前追加练习

[root@server0~]# sed 'i 666' test  ##所有行前添加一行666
666
root:x:0:0:root:/root:/bin/bash
666
bin:x:1:1:bin:/bin:/sbin/nologin
666
daemon:x:2:2:daemon:/sbin:/sbin/nologin
666
adm:x:3:4:adm:/var/adm:/sbin/nologin
666
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0~]# sed '2,+1i 666' test  ##第2~3行前添加一行666
root:x:0:0:root:/root:/bin/bash
666
bin:x:1:1:bin:/bin:/sbin/nologin
666
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0~]# sed '/root/i 666' test  ##有root的行前添加一行666
666
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0~]# sed '/^root/i 666' test  ##以root开头的行添加一行666
666
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server0~]# sed '2i 666' test    ##第2行前添加一行666
root:x:0:0:root:/root:/bin/bash  
666
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

c替换练习

[root@server0 ~]# sed 'c XXXX' user                   #将所有行替换为XXXX
XXXX
XXXX
XXXX
XXXX
XXXX[root@server0 ~]# sed '1c XXXX' user                 #将第一行替换成XXXX
XXXX
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@server0 ~]# sed '1,2c XXXX' user                #将第一二行替换成XXXX
XXXX
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@server0 ~]# sed '/root/c XXXX' user           #将以root开头的行替换成XXXX
XXXX
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sed高级应用

导入导出操作

  • r 动作应结合 -i 选项才会存入,否则只输出
  • w 动作以覆盖的方式另存为新文件
操作符  用途指令示例
r读取文件3r b.txt 在第3行下方添加文件b.txt
4,7r b.txt 在第4-7行后添加文件b.txt
w保存到文件3w c.txt 将第3行另存为文件c.txt
4,7w c.txt 将第4-7行另存为文件c.txt

!取反操作

用途:

  • 根据定址条件取反

示例

  • 列出不使用bash的用户账号记录
[root@server0]# sed -n '/bash$/!p' /etc/passwd  ##输出不是以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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
......

sed综合脚本应用

编写一个脚本

要求编写脚本getupwd.sh,实现以下需求:

  • 找到使用bash作登录Shell的本地用户
  • 列出这些用户的shadow密码记录
  • 按每行“用户名 --> 密码记录”保存到getupwd.log,如图-1所示

方案:

  1. 先用sed工具取出登录Shell为/bin/bash的用户记录,保存为临时文件/tmp/urec.tmp,并计算记录数量
  2. 再结合while循环遍历取得的账号记录,逐行进行处理
  3. 针对每一行用户记录,采用掐头去尾的方式获得用户名、密码字串
  4. 按照指定格式追加到/tmp/getuupwd.log文件
  5. 结束循环后删除临时文件,报告分析结果
[root@server0 ~]# vim  1.sh
#!/bin/bash
#这是一个存放可登陆shell用户的脚本
u=`sed  -n  '/bash$/s/:.*//p'   /etc/passwd`            #先找到以bash结尾的登录用户
for i in  $u                                            #交给for循环处理
dow=`grep  "$i:"  /etc/shadow`                    #找到每个用户对应的shadow记录w1=${w#*:}                                      #掐头w2=${w1%%:*}                                    #去尾,得到纯粹的密码信息echo  "$i -->  $w2"
done
[root@server0 ~]# bash 1.sh
root -->  $6$UiGI4Tc2$htsXYn5cJnOqv3P1VLcUSgfjDu2pL5yiJBuua6foZAHdwqeuLHfYUfS/vBn27Wjvoel8EJgtdsMjyquqvKAmf1
student -->  $6$8oIjLCsc$/n1iQXYh1E6.uOEuJKgioqAtmqm2TQmkJGF2RwyteIr1tIfrPdiRYgWe6Sjen5/eMij2uHM/a1tue/QRlo3X80
hsjdh -->  $6$98VeecB8$Egm5RIgr4atgvvJVIYQyXf5BIMfJLKt8txHkWU/aTxJIZTqZWLOwxtHdS7mbgnUlGFi7sqvrB6npWosidKzQ41

 

这篇关于字符串的初值 正则表达式 sed应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870354

相关文章

2390.从字符串中移除星号

给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号左侧最近的那个非星号字符,并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意: 生成的输入保证总是可以执行题面中描述的操作。 可以证明结果字符串是唯一的。 示例 1: 输入:s = “leet**cod*e” 输出:“lecoe” 解释:从左到右执行移除操作: 距离第 1 个

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

Linux文本三剑客sed

sed和awk grep就是查找文本当中的内容,最强大的功能就是使用扩展正则表达式 sed sed是一种流编辑器,一次处理一行内容。 如果只是展示,会放在缓冲区(模式空间),展示结束后,会从模式空间把结果删除 一行行处理,处理完当前行,才会处理下一行。直到文件的末尾。 sed的命令格式和操作选项: sed -e '操作符 ' -e '操作符' 文件1 文件2 -e表示可以跟多个操作

剑指offer(C++)--左旋转字符串

题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! class Solution {public:string LeftRotateStri

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

PyTorch模型_trace实战:深入理解与应用

pytorch使用trace模型 1、使用trace生成torchscript模型2、使用trace的模型预测 1、使用trace生成torchscript模型 def save_trace(model, input, save_path):traced_script_model = torch.jit.trace(model, input)<