关于linux修改用户权限 linux修改文件内容替换

1. 前言
sed全名叫stream editor , 流编辑器,用程序的方式来编辑文本,它一次处理一行内容 。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space) , 接着用sed命令处理模式空间中的内容,处理完成后,把缓冲区的内容送往屏幕 。接着处理下一行 , 这样不断重复,直到文件末尾 。文件内容并没有改变,因为这些都在模式空间处理的 。Sed可以用来自动编辑一个或多个文件 。

关于linux修改用户权限 linux修改文件内容替换

文章插图
Linux批量替换文件内容
普及一下正则表达式的一些基本知识:
^ 表示一行的开头 。如:/^#/ 以#开头的匹配 。
不能识别此Latex公式: 表示一行的结尾 。如:/}/ 以}结尾的匹配 。
< 表示词首 。如:<abc 表示以 abc 为首的詞 。
\> 表示词尾 。如:abc\> 表示以 abc 結尾的詞 。
. 表示任何单个字符 。
  • 表示某个字符出现了0次或多次 。
  • [ ] 字符集合 。如:[abc] 表示匹配a或b或c,还有 [a-zA-Z] 表示匹配所有的26个字符 。如果其中有^表示反,如 [a] 表示非a的字符
2. sed命令选项
-n :使用安静(silent)模式 。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上 。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来 。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内 ,  -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法 。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端 。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function:
a\ 在当前行下面插入文本 。
i\ 在当前行上面插入文本 。
c\ 把选定的行改为新的文本 。
d 删除,删除选择的行 。
D 删除模板块的第一行 。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区 。
H 追加模板块的内容到内存中的缓冲区 。
g 获得内存缓冲区的内容,并替代当前模板块中的文本 。
G 获得内存缓冲区的内容 , 并追加到当前模板块文本的后面 。
l 列表不能打印字符的清单 。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令 。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行 , 改变当前行号码 。
p 打印模板块的行 。
P(大写) 打印模板块的第一行 。
q 退出Sed 。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾 。
r file 从file中读行 。
t label if分支,从最后一行开始,条件一旦满足或者T , t命令,将导致分支到带有标号的命令处,或者到脚本的末尾 。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处 , 或者到脚本的末尾 。
w file 写并追加模板块到file末尾 。
W file 写并追加模板块的第一行到file末尾 。
! 表示后面的命令对所有没有被选定的行发生作用 。
= 打印当前行号码 。
# 把注释扩展到下一个换行符以前 。
关于linux修改用户权限 linux修改文件内容替换

文章插图
Linux sed命令详解
3. 测试文件说明
复制/etc/passwd到~/zcwyou.txt
[root@zcwyou ~]# cp /etc/passwd ~/zcwyou.txt下文以zcwyou.txt作说明 。
4. 使用sed删除输出结果某些行
打印zcwyou.txt的内容并附带行号 , 不显示3-7行
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '3,7d'sed 的动作为 ‘3,7d’ ,d表示删除 。同时也要注意的是,sed 后面接的动作,请务必以 ” 两个单引号括住喔!
5. 删除特定的行
把输出结果删除第2行 。
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2d' 删除带有123的行:
[root@zcwyou ~]# sed '/123/d' zcwyou.txt删除第二行
[root@zcwyou ~]# sed '2d' zcwyou.txt删除第2行到最后一行 。
[root@zcwyou ~]# sed '2,$d' zcwyou.txt6. 从某行开始删除
要删除第 3 到最后一行
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '3,$d' 7. 使用sed添加行
在第二行后面加上字符串hello jack
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2a hello jack'在第二行前面加上字符串hello jack
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2i hello jack' 以行为单位的替换与显示
将第2-5行的内容取代成为Line2-5
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '2,5c Line2-5'8. 根据条件仅列出某些行
仅列出 ~/zcwyou.txt 文件内的第 5-7 行
[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '5,7p'9. 使用sed查找数据
打印~/zcwyou.txt的内容,查找带root的行并打印2次 。
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '/root/p'如果root找到,除了输出所有行 , 还会输出匹配行 。
【关于linux修改用户权限 linux修改文件内容替换】[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '/root/p'查看关键词并删除
删除~/zcwyou.txt所有包含root的行,输出其他内容
[root@zcwyou ~]# nl ~/zcwyou.txt | sed '/root/d'10. 查看关键词并执行命令
搜索~/zcwyou.txt,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为abcshell,再输出这行:
[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '/root/{s/bash/abcshell/;p}'如果只替换~/zcwyou.txt的第一个bash关键字为abcshell,完成后自动退出
[root@zcwyou ~]# nl ~/zcwyou.txt | sed -n '/bash/{s/bash/abcshell/;p;q}' 11. 打印奇数行或偶数行
方法1:
奇数行
[root@zcwyou ~]# sed -n 'p;n' zcwyou.txt偶数行
[root@zcwyou ~]# sed -n 'n;p' zcwyou.txt方法2:
奇数行
[root@zcwyou ~]# sed -n '1~2p' zcwyou.txt偶数行
[root@zcwyou ~]# sed -n '2~2p' zcwyou.txt打印匹配字符串的下一行
[root@zcwyou ~]# grep -A 1 SCC zcwyou.txt[root@zcwyou ~]# sed -n '/SCC/{n;p}' zcwyou.txt[root@zcwyou ~]# awk '/SCC/{getline; print}' zcwyou.txt12. 查找关键词并替换
格式:
sed ‘s/要被取代的字串/新的字串/g’
先看看现有的样版文件内容:
[root@zcwyou ~]# cat sshforwarding.service 输出结果:
[Unit]
Description=SSH Forward TCP Port 9001 To SS Server
Documentation=https://linux.die.net/man/1/ssh
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/bin/ssh -NT -f -L my_public_ip:9001:SS_server:9001 localhost
ExecReload=/bin/kill -HUP
关于linux修改用户权限 linux修改文件内容替换

文章插图
MAINPID
[Install]
WantedBy=multi-user.target
要求把以上文本中的9001替换为9002
替换命令:
[root@zcwyou ~]# sed "s/9001/9002/g" sshforwarding.service输出结果:
[Unit]
Description=SSH Forward TCP Port 9002 To Shadowsocks Server
Documentation=https://linux.die.net/man/1/ssh
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/bin/ssh -NT -f -L my_public_ip:9002:shadowsocks_server:9002 localhost
ExecReload=/bin/kill -HUP
关于linux修改用户权限 linux修改文件内容替换

文章插图
MAINPID
[Install]
WantedBy=multi-user.target
可以看到,9001已经被换为9002,但这样并没有修改源文件,也没有保存为新文件,我们需要把它重定向保存为新文件 。
替换后保存为新文件:
[root@zcwyou ~]# sed "s/9001/9002/g" sshforwarding.service > sshforwarding9002.service这样就可以保存为新文件sshforwarding9002.service
如果只替换第4到第8行的文本内容,命令如下:
[root@zcwyou ~]# sed "4,8s/9001/9002/g" zcwyou.txt只替换每一行的第一个abc:
[root@zcwyou ~]# sed 's/abc/S/1' zcwyou.txt只替换每一行的第二个abc:
[root@zcwyou ~]# sed 's/abc/S/2' zcwyou.txt只替换第一行的第3个以后的abc:
[root@zcwyou ~]# sed 's/abc/S/3g' zcwyou.txt13. 替换匹配行
使用选项c
把zcwyou.txt的第二行替换为line 2
[root@zcwyou ~]# sed "2 c line 2" zcwyou.txt查看带有abc的行,替换内容为line hahaha
[root@zcwyou ~]# sed "/abc/c line hahaha" zcwyou.txtsed替换标记
关于linux修改用户权限 linux修改文件内容替换

文章插图
linux sed 替换字符串
g 表示行内全面替换 。
p 表示打印行 。
w 表示把行写入一个文件 。
x 表示互换模板块中的文本和缓冲区中的文本 。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记
14. sed同时执行多任务
一条sed命令,删除~/zcwyou.txt第三行到末尾的数据,并把bash替换为abcshell
[root@zcwyou ~]# nl ~/zcwyou.txt | sed -e '3,$d' -e 's/bash/abcshell/'-e表示多点编辑,第一个动作是删除~/zcwyou.txt第三行到末尾的数据 , 第二条命令搜索bash替换为abcshell 。
15. 使用sed直接修改文件内容(危险不建议)
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件 , 所以建议找一个无用的文件做测试,比如本文里的zcwyou.txt,仅仅用来实验研究 。
利用sed将zcwyou.txt内的每一行结尾a换成b
[root@zcwyou ~]# sed -i 's/a$/b/g' zcwyou.txt利用 sed 直接在zcwyou.txt 最后一行加入字符end
[root@zcwyou ~]# sed -i '$a end' zcwyou.txt$代表的是文件最后一行,而a表示新增内容,因此执行结果是使该文件最后一行新增字符end 。不要忘记了,该方法是直接修改源文件,除非你清楚清楚后果,强烈建议使用副本修改并确认无误后才覆盖线上的配置环境 。
sed的-i选项非常实用,特别是遇到大文件要修改时,如果你使用vi或vim修改,效率将会非常低 。而使用sed,它会自动查找并按要求完成,非常处理速度极为迅速,几乎没有等待 。


    以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

    「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: