因经常要在服务器上修改差不多的配置文件,比如新搭建一台web环境,通过镜像启动后,某些配置文件需要修改,
需求:有超过10多个php项目的.env文件需要把数据库链接地址、用户名更换为新的。
如果一两个修改修的话通过vim很方便修改,但如果10多个甚至几十个的配置修改。一个个改就不是程序员的风格了。那能不能不打开文件就直接修改呢。你能想到的90%都被人实现了。那就看看SED吧。下文是老外都总结好了的,我机器(翻译)成了中文。但例子还是得自己来一边的。这样自己才能学会。let's go.
基础知识要求:了解linux正则、管道符、cat命令
sed实例介绍
sed是GNU / Linux的有用的文本处理功能。sed的完整形式是Stream Editor。通过使用sed命令可以很容易地完成许多类型的简单和复杂的文本处理任务。可以使用带有sed命令的正则表达式来搜索,替换和删除文本或文件中的任何特定字符串。但是此命令会临时执行所有类型的修改,并且默认情况下不会更改原始文件内容。如果需要,用户可以将修改后的内容存储到另一个文件中。sed命令的基本用法在本教程中通过使用50个独特的示例进行了说明。
为了使大家方便阅读对输出进行缩进,
[root@zjt]$ cat os.txt Windows Linux Android OS
真正的输出为
[root@zjt]$ cat os.txtWindowsLinuxAndroidOS
在开始本教程之前,您必须通过运行以下命令来检查操作系统中sed的安装版本。本教程基于GNU sed设计。因此,需要使用此版本的sed来练习本教程中显示的示例。
[root@zjt]$ sed --versionsed (GNU sed) 4.2.2.....
我机器上的是4.2.2
sed [options]… [script] [file]sed [选项] … [脚本] [ 文件]
如果sed命令没有提供文件名,那么该脚本将在标准输入数据上运行。sed脚本无需任何选择即可执行。
示例列表
1、使用“ sed”进行基本文本替换
[root@zjt]$ echo "php是最好的语言" | sed 's/php/Python/'Python是最好的语言
sed命令也可以用来替换文件内容的任何部分。创建一个名为weekday.txt的文本文件,其内容如下。
weekday.txt
MondayTuesdayWednesdayThursdayFridaySaturdaySunday
cat weekday.txt[root@zjt]$ sed 's/Sunday/Sunday is holiday/' weekday.txt
输出:
执行上述`sed`命令后,“ dayday”存在于weekday.txt文件中,该词被文本“ Sunday is holiday”替换。但文件内容并没有真正的变化
2、使用“ g”选项替换文件特定行中所有文本实例
'sed'命令中使用'g'选项来替换所有匹配模式。使用以下内容创建一个名为python.txt的文本文件,以了解'g'选项的用法。该文件包含多个“ Python”。
为了方便学习,我把原来的python.txt的内容修改为下面的了。不用介意语法。
python.txt
Python is a very popular language. Python is easy extended.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language.
只替换第一次出现 的位置
php is a very popular language. Python is easy extended.php is easy to use. Python is easy to learn. Python is usefull.php is a cross-platform language.
在上子命令g
Python is a very popular language. Python is easy extended.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language. [root@zjt-baidu-server sed]# sed 's/Python/Php/g' python.txtPhp is a very popular language. Php is easy extended.Php is easy to use. Php is easy to learn. Php is usefull.Php is a cross-platform language.
以下命令将替换文件python.txt第二行中所有出现的“ Python ” 。在这里,“ Python”在第二行中出现了三次次。
输出:
[root@zjt]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [root@zjt]$ sed '2 s/Python/perl/g' python.txt Python is a very popular language. Python is easy extended. perl is easy to use. perl is easy to learn. perl is usefull. Python is a cross-platform language.
3、仅替换第二个以后的匹配项
如果某个单词在文件中多次出现,则可以通过使用带有出现编号的“ sed”命令来替换每行中该单词的特定出现。下面的“ sed”命令将替换文件python.txt中每一行中第二次以后出现的搜索模式。
为了更清楚的演示功能,我把python.txt修改为以下内容
替换第二个以后的
替换第二个以后的Python is a very popular language Python.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language[root@zjt-baidu-server sed]# cat python.txt Python is a very popular language Python.Python is easy to use. Python is easy to learn. Python is usefull.Python is a cross-platform language替换第二个以后的[root@zjt-baidu-server sed]# sed 's/Python/php/g2' python.txt Python is a very popular language php.Python is easy to use. php is easy to learn. php is usefull.Python is a cross-platform language
替换第三个以后的
[root@zjt]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [root@zjt]$ sed 's/Python/php/g3' python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. php is usefull. Python is a cross-platform language.
4、仅替换最后一行匹配项,当然如果这行只有一个,也会被替换掉
$ sed 's/(.*)Python/1Php/' python.txt Python is a very popular language. Php is easy extended. Python is easy to use. Python is easy to learn. Php is usefull. Php is a cross-platform language.
5、仅替换第一出现的匹配项
sed 's/(.*)Python/1Php/' python.txt
6、匹配最后行出现的匹配项,也就是匹配最后一行的,第一个匹配项.
“ $”符号用于匹配模式的最后一行
[root@zjt]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [root@zjt]$ sed '$ s/Python/php/' python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. php is a cross-platform language.当我添加了一个Python以后并没有被替换掉[root@zjt]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. Python[root@zjt]$ sed '$ s/Python/php/' python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. php is a cross-platform language. Python
7、反斜杠来转义路径,其实正则分隔符可以指定,看着就没有那么闹心了,比如用;
[root@zjt]$ echo /home/ubuntu/code/perl/add.pl | sed 's///---/g' ---home---ubuntu---code---perl---add.pl[root@zjt]$ echo /home/ubuntu/code/perl/add.pl | sed 's;/;---;g' ---home---ubuntu---code---perl---add.pl
8、将文件绝对路径更换为无目录,只剩下文件名
[root@zjt]$ echo "/home/ubuntu/temp/myfile.txt" | sed 's/.*///'myfile.txt
9、替换中的判断,当某些文件存在才替换
创建文本文件dept.txt
在包含文本“ CSE ” 的行中把Count替换为100,包含“ EEE”的行中替换为70
CSE - CountEEE - CountCivil - Countbogon:yy-api zhangjuntao$ sed -e '/CSE/ s/Count/100/; /EEE/ s/Count/70/;' dept.txtCSE - 100EEE - 70Civil - Count
10、判断不存在的时候替换
不包含文本“ CSE”的行把“ Count ”替换为80。
[root@zjt]$ cat dept.txt CSE - Count EEE - Count Civil - Count[root@zjt]$ sed -e'/CSE/! s/Count/80/;' dept.txt CSE - Count EEE - 80 Civil - 80
11、在匹配模式之前和之后使用' 1'添加字符串
[root@zjt]$ echo "Bash language" | sed 's/(Bash)/Learn 1 programming/' Learn Bash programming language
12、删除匹配的行
d选项可以删除匹配的行
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed '/OS/d' os.txt Windows Linux Android
13、删除匹配行和匹配行之后的2行
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed '/Linux/,+2d' os.txt Windows
14、删除文本行末尾的所有空格
[root@zjt]$ cat -E os.txt Windows$ Linux 1$ Android $ OS$[root@zjt]$ sed -i 's/[[:blank:]]*$//' os.txt[root@zjt]$ cat -E os.txt Windows$ Linux 1$ Android$ OS$
15、删除该行两次匹配的所有行
“ PHP”文本在文件input.txt第二行中包含两次。在此示例中,使用了两个`sed'命令来两次删除包含模式' php '的那些行。第一个“ sed”命令将每行中第二个出现的“ php”替换为“ dl ”,并作为输入发送到第二个“ sed”命令中。第二条“ sed”命令将删除包含文本“ dl ”的行。
[root@zjt]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[root@zjt]$ sed 's/php/dl/i2;t' input.txt | sed '/dl/d' PHP is a server-side scripting language. PHP is platform-independent.
16、删除所有只有空格的行
[root@zjt-baidu-server sed]# vim os.txt 1 Windows$ 2 ^I $ 3 Linux$ 4 ^I $ 5 Android$ 6 $ 7 OS$ 8 $~ sed '/^$/d' input.txt
17、删除所有不可打印的字符
通过将不可打印字符替换为空,可从任何文本中删除不可打印字符。在此示例中,使用[:print:]类来查找不可打印的字符。' t'是不可打印的字符,不能由`echo`命令直接解析。为此,在'echo'命令中使用的$tab变量中分配了' t'字符。echo命令的输出在sed命令中发送,该命令将从输出中删除字符' t'。
[root@zjt]$ tab=$''[root@zjt]$ echo Hello"$tab"WorldHelloWorld[root@zjt]$ echo Hello"$tab"World | sed 's/[^[:print:]]//g'HelloWorld
18、向匹配行的行末添加内容
以下命令将在os.txt文件中包含文本“ Windows”的行的末尾追加“10”
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed '/Windows/ s/$/ 10/' os.txt Windows 10 Linux Android OS
19、在匹配行之前插入一行
[root@zjt]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[root@zjt]$ sed '/PHP is platform-independent/ s/^/PHP 是世界上最好的语言./' input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP 是世界上最好的语言. PHP is platform-independent
20、在匹配行之后插入一行
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed 's/Linux/&Ubuntu/' os.txt Windows Linux Ubuntu Android OS
21、向不匹配的行末尾添加内容
以下“ sed”命令将在os.txt中搜索不包含“ Linux”文本的行,并在每行末尾附加文本“ Operating System ”。在这里,“ $”符号用于标识将要附加新文本的行。
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed '/Linux/! s/$/ Operating System/' os.txt Windows Operating System Linux Android Operating System OS Operating System
22、删除不匹配的行
[root@zjt]$ cat web.txt HTML 5 JavaScript CSS PHP[root@zjt-baidu-server sed]# sed '/CSS/!d' web.txt CSS
23、在匹配的单词后面添加空格
在文本中寻找to单词,如果找到
“&”符号用于附加重复的文本。
to后面变成了两个空格
[root@zjt]$ cat python.txt Python is a very popular language. Python is easy extended. Python is easy to use. Python is easy to learn. Python is usefull. Python is a cross-platform language. [root@zjt]$ sed -e 's/to /& to/g' python.txt Python is a very popular language. Python is easy extended. Python is easy to touse. Python is easy to tolearn. Python is usefull. Python is a cross-platform language.
24、用新字符串替换一个字符串列表
这个功能太有用了,以前都是写程序数组循环的。这个逻辑有点绕。
[root@zjt]$ cat list1.txt 1001 => 涛哥 1023 => 李四 1067 => 王五[root@zjt]$ cat list2.txt 1001 北大 平均分-3.63 1002 北大 平均分-3.24 1023 北大 平均分-3.11 1067 北大 平均分-3.84[root@zjt]$ sed `cat list1.txt | awk '{print "-e s/"$1"/"$3"/"}'`<<
25、用包含换行符的字符串替换匹配的字符串
其实就是用表示换行
[root@zjt]$ echo "Bash Perl Python Java PHP ASP"| sed 's/Python/Added Text/'Bash Perl Added Text Java PHP ASP[root@zjt-baidu-server sed]# echo "Bash Perl Python Java PHP ASP"| sed 's/Python/Added Text/'Bash Perl Added Text Java PHP ASP
26、从文件中删除换行符,并在每行末尾插入一个逗号
知识点和上一个一样都是换行知识点。以前都是用编辑器替换的,以后不用打开文件直接搞定。
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed -z 's//,/g' os.txt Windows,Linux,Android,OS,
27、删除逗号并添加换行符以将文本分成多行
和26执行相反的操作,把逗号替换为换行。
[root@zjt]$ echo "Kaniz Fatema,30th,batch" | sed "s/,//g"
28、查找不区分大小写的匹配并删除行
知识点字母I不区分大小写
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed '/linux/Id' os.txt Windows Android OS
29、查找不区分大小写的匹配项并替换为新文本
[root@zjt]$ echo "我喜欢bash编程" | sed 's/Bash/PHP/i'我喜欢PHP编程
30、查找不区分大小写的匹配项,并替换为相同文本的所有大写字母
sed中使用' U'将任何文本转换为全部大写字母。
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed 's/(linux)/U1/Ig' os.txt Windows LINUX Android OS
31、查找不区分大小写的匹配项,并替换为相同文本的所有小写字母
sed中使用' L'将任何文本转换为所有小写字母。
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed 's/(linux)/L1/Ig' os.txt Windows linux Android OS
32、用小写字符替换文本的所有大写字符
[root@zjt]$ echo 'Windows Linux' |sed 's/(.*)/L1/'
33、在行中搜索数字,并在数字之前附加货币符号
[root@zjt]$ cat items.txt 硬盘 1000 显示器 800 鼠标 100[root@zjt]$ sed 's/([1-9])/¥1/g' items.txt 硬盘 ¥1000 显示器 ¥800 鼠标 ¥100
34、在数字上每超过3位后添加逗号
[root@z]$ echo "5098673" | sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta'5,098,673
35、用4个空格字符替换制表符
[root@zjt-baidu-server sed]#echo -e "123" | sed $'s// /g'
36、用制表符替换连续的四个空格字符
# echo -e "1 2" | sed $'s/ //g'12
37、将所有行截断为前10个字符
[root@zjt]$ cat in.txt PHP是服务器端脚本语言。 PHP是一种开源语言,PHP区分大小写。PHP是与平台无关的。 以下“ sed”命令会将in.txt文件的每一行截断为80个字符。[root@zjt]$ sed 's/(^.{1,10}).*/1/' in.txt PHP是服务器端脚本 PHP是一种开源语言 以下“ sed”命令
38、搜索字符串正则表达式,并在其后附加一些标准文本
[root@zjt-baidu-server sed]#$ echo "hello, how are you?" | sed 's/(hello)/1 John/'
39、搜索字符串正则表达式,并在每行的第二个匹配项之后附加一些文本
[root@zjt]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[root@zjt]$ sed 's/(PHP)/1 (我是新加的)/2' input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP (我是新加的) is case-sensitive. PHP is platform-independent.
40、通过指定文件运行多个SED命令
知识点通过-f 指定命令文件
[root@zjt]$ cat sedcmd s/PHP/ASP/ s/independent/dependent/[root@zjt]$ cat input.txt PHP is a server-side scripting language. PHP is an open-source language and PHP is case-sensitive. PHP is platform-independent.[root@zjt]$ sed -f sedcmd input.txt ASP is a server-side scripting language. ASP is an open-source language and PHP is case-sensitive. ASP is platform-dependent.
41、匹配多行模式并替换为新的多行文本
下面的“ sed”命令将搜索多行文本“ Linux nAndroid”,如果模式匹配,则匹配行将被多行文本“ Ubuntu nAndroid Lollipop ” 替换。此处,P和D用于多行处理。
42、替换文本中与模式匹配的两个单词的顺序
[root@zjt]$ echo "perl python" | sed -e 's/([^ ]*) *([^ ]*)/2 1/'
43、从命令行执行多个“ sed”命令
[root@zjt]$ echo "Ubuntu Centos Debian" | sed -e 's/Ubuntu/Kubuntu/; s/Centos/Fedora/'
44、将sed与其他命令结合
先通过cat命令读取文件,作为下个sed的输入,然后执行完,再传给下个sed
管道符的学习和应用
[root@zjt-baidu-server sed]# cat os.txt | sed 's/Linux/Fedora/'| sed 's/windows/Windows 10/i'Windows 10FedoraAndroidOS
45、在文件中插入空行
'G'选项用于在文件中插入空行。
这个在我的linux服务器上执行不成功,应该是版本低,4.2.2的在我的mac上成功了。
而且mac不支持sed --version 算了不折腾他,毕竟都是在linux上使用呢。仅供参考
bogon:tmp zhangjuntao$ cat 1.txt111222333bogon:tmp zhangjuntao$ sed G 1.txt111222333
46、替换掉字母数字符。
$ cat stdlist #ID #Name[101] -zhangsan[102] -zhangsanfeng$ sed 's/[A-Za-z0-9]//g' stdlist # #[] -[] -
47、使用“&”打印匹配的字符串
以下命令将搜索以“ L”开头的单词,并通过使用“&”符号将“匹配的字符串为– ” 附加到匹配的单词,从而替换文本。在此,“ p”用于打印修改后的文本。
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed -n 's/^L/Matched String is - &/p' os.txtMatched String is - Linux
48、把文件中的两列对调
[root@zjt-baidu-server sed]# cat course.txt PHP ASPMySQL OracleCodeIgniter Laravel[root@zjt-baidu-server sed]# sed 's/([^ ]*) *([^ ]*)/2 1/' course.txtASP PHPOracle MySQLLaravel CodeIgniter扩展下、只保留PHP ASP javaMySQL Oracle db2CodeIgniter Laravel yii[root@zjt-baidu-server sed]# sed 's/([^ ]*) *([^ ]*)*([^ ]*)/1 3/' course.txtPHP javaMySQL db2CodeIgniter yii
49、大写每个单词的第一个字符
[root@zjt]$ echo "I like bash programming" | sed 's/([a-z])([a-zA-Z0-9]*)/u12/g'I Like Bash Programming
50、打印文件的行号
[root@zjt]$ cat os.txt Windows Linux Android OS[root@zjt]$ sed '=' os.txt 1 Windows 2 Linux 3 Android 4 OS
上面的教程通过使用非常简单的示例说明了sed命令的不同用法。这里提到的所有`sed`脚本的输出都是临时生成的,原始文件的内容保持不变。可以使用sed命令的–i或–in-place选项修改原始文件。
[root@zjt]$ sed -i '=' os.txt[root@zjt]$ cat os.txt 1Windows2Linux3Android4OS
sed使用好了可以大幅度提高文件的修改速度,但如果要加-i选项对服务器文件修改,有一定危险性。
一定提前备份;
一定提前备份;
一定提前备份;
替换步骤
- 对文件备份
- 用临时文件做测试
- 替换或者先输出检查
- 用vimdiff等对比工具对比
总结 格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
欢迎点赞,评论,转发,收藏!!!
有不对的感谢指正!!!