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