perl输出匹配的当前行以及下一行_详解Linux sed 命令语法、以及经典50例

本文详细介绍了如何使用Linux的sed命令进行文本处理,包括替换、删除、插入等操作,以实现批量修改文件内容。通过50个实例展示了sed的基本用法,如替换特定行、替换所有匹配项、有条件地替换等,强调了在实际操作中需注意的细节,如备份文件、使用-i选项的风险等。
摘要由CSDN通过智能技术生成

因经常要在服务器上修改差不多的配置文件,比如新搭建一台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选项对服务器文件修改,有一定危险性。

一定提前备份;

一定提前备份;

一定提前备份;

替换步骤

  1. 对文件备份
  2. 用临时文件做测试
  3. 替换或者先输出检查
  4. 用vimdiff等对比工具对比

总结 格式

sed [options] 'command' file(s)

sed [options] -f scriptfile file(s)

e043f9d5-fd22-eb11-8da9-e4434bdf6706.png
e843f9d5-fd22-eb11-8da9-e4434bdf6706.png
e943f9d5-fd22-eb11-8da9-e4434bdf6706.png
eb43f9d5-fd22-eb11-8da9-e4434bdf6706.png

欢迎点赞,评论,转发,收藏!!!

有不对的感谢指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值