推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

linux sed 命令

   2023-06-24 网络整理佚名1830
核心提示:基本命令格式-e:指定在指令列模式上执行的命令文本。-i:直接修改读取的文档,而不是输出到终端。命令文本则是由命令和其它一些信息组合起来的一个字符串,用来执行具体的操作。选项后命令行上没有输出内容,但是源文件被更新了。的文件,在里面添加三个命令文本如下:文件中的三个命令文本都被执行了!命令只替换匹配到的内容(一般为字符串):下面几个是正则表达式匹配后执行操作的例子:

sed 是一个流编辑器 ( ),主要用于执行文本替换。 但 sed 主要设计用于以批处理方式编辑文件,而不是交互方式。

命令介绍

基本命令格式

sed 【常用选项】命令文本输入

常用选项

-n (--quiet,--):安静模式。 在 sed 的基本用法中,标准输出中的所有信息都会列出到终端。 使用 -n 参数,只有 sed 处理过的行才会被输出。

-e:指定在命令行模式下执行的命令文本。 默认情况下不需要指定,只有在同时执行多个命令文本时才需要显式指定-e选项。

-f:当要同时执行多个命令文本时,可以将这些命令文本写入一个文件,然后通过-f使用。

-r:sed 默认使用基本正则表达式语法(BRE),指定 -r 选项后使用扩展正则表达式语法(ERE)。

-i:直接修改读取的文档,而不输出到终端。

常用命令

a:添加新行,a后面跟着一个字符串,这些字符串会添加到匹配行的下面。

c:替换行,c后面跟着一个字符串,这些字符串将替换匹配的行。

d:删除行,删除匹配的行。

i:插入行,i后面跟着一个字符串,这些字符串会插入到匹配行的上方。

p:打印,输出一些行。 通常p会与参数-n一起使用,这样就只输出匹配的行。

s:字符串替换,主要与正则表达式配合使用。

本文解释一下“命令”和“命令文本”的区别:

命令是一些抽象操作,例如a表示添加新行,d表示删除行。

命令文本是由命令和其他信息组成的字符串,用于执行特定的操作。

例如第一行下面添加一行,内容为'Hello world',命令文本为:'1a Hello world'

又例如删除包含字符串'Hello world'的行,命令文本为:'/Hello world/d'

常用选项和命令详细说明

注:本文示例中的演示文件test.txt包含三行文本,内容为:

aa
bb
cc

演示文件hello.txt包含三行文本,内容为:

Hello world! Hello Jack!
Hello China!
Hello Nick!

删除行

删除行需要使用命令 d:

$ sed '1d' test.txt            # 删除第一行
$ sed '$d' test.txt            # 删除最后一行
$ sed '1,2d' test.txt          # 删除第一行到第二行
$ sed '2,$d' test.txt          # 删除第二行到最后一行

注意,执行上述命令后,我们只能在命令行终端看到正确的结果,而test.txt文件根本没有改变:

选项-i

如果想直接在原文件上修改(其实就是先修改文件内容,然后保存到原文件中),需要使用选项-i:

$ sed -i '1d' test.txt

请注意,应用 -i 选项后,命令行上没有输出,但源文件已更新。

新队

a 命令可以在匹配行下面添加新行:

$ sed '1a Hello world!' test.txt                  # 在第一行下面新增一行,内容为 "Hello world!"
$ sed '$a Hello world!' test.txt                  # 在最后一行下面新增一行,内容为 "Hello world!"
$ sed '1,3a Hello world!' test.txt                # 在第一行,第二行和第三行下面分别增加一行,内容  
                                                  # 为 "Hello world!" 1,3 表示从第一行到第三行
$ sed '1a Hello world!\nHello China!' test.txt    # 一次增加多行需要使用换行符 \n

选项-e

-e选项用于指定命令文本,如果只有一个命令文本,-e选项可以省略。 如果要指定多个命令文本,则需要使用-e选项。

$ sed -e '1a xxx' -e '2a yyy' test.txt

插入行

i 命令可以在匹配行上方插入一行。 语法与添加新行相同,只不过新行位于指定行之上(与 a 命令的区别):

选项-f

前面我们通过选项-e添加了多个命令文本,但是如果需要添加更多命令文本,那么使用选项-e就不合适了。 因为把所有的命令文本都写在命令行中会给维护带来困难。 这就是选项 -f 派上用场的地方。 我们可以将多个命令文本写入一个文本文件,然后用 -f 选项引用它们。

我们创建一个名为 的文件,并在其中添加三个命令文本,如下所示:

1i Hello world!
2i Hello world!
3i Hello world!

然后执行命令:

$ sed -f commands test.txt

使用 -f 选项,文件中的所有三个命令文本都会被执行!

更换线

使用 c 命令可以轻松执行全行替换:

$ sed '1c  Hello world!' test.txt         # 把第一行替换为 "Hello world!"
$ sed '1,3c Hello world!' test.txt        # 把第一行到第三行替换为 "Hello world!"

注意,上图中的命令将三行文本替换为一行文本!

字符串替换

与行替换不同的是,s命令只替换匹配的内容(通常是字符串):

$ sed 's/Hello/Hi/' hello.txt             # 把Hello 替换为 Hi

上图给我们带来的一个困惑是:为什么只替换了第一行的第一个Hello? 答案是sed默认只会替换第一个匹配到的内容! 那么我们的第二个困惑就来了:如果只替换第一个匹配的内容,为什么第二行和第三行的Hello也要替换呢? 这个问题涉及到sed的工作方式,sed是以行为为单位进行文本处理的工具! 因此,将图中的三行分为三次,对每一行进行处理。 因此,第二行和第三行的Hello是本行最先匹配到的内容,替换是正确的。

要进行全局替换,您需要在命令文本中指定 g,请尝试以下命令:

$ sed 's/Hello/Hi/g' hello.txt             # 把匹配到的所有Hello 都替换为 Hi

现在第一行的两个 Hello 都被替换了。

我们还可以限制执行替换操作的行:

$ sed '2,3s/Hello/Hi/g' hello.txt          # 只在第二行和第三行进行替换操作

当然,您也可以通过替换来删除不需要的字符串:

$ sed 's/Hello//g' hello.txt               # 删除字符串 Hello

定界符

尽管 / 是最常见的分隔符,但您也可以使用其他字符。 举个简单的例子,当你想在linux下进行路径替换时,使用/作为分隔符是非常不舒服的(需要大量的转义字符),此时改变一个分隔符就是最好的解决方案:

在上图中,我们使用分号作为分隔符轻松实现了路径替换。

匹配

细心的同学可能已经注意到,sed的所有操作都是基于行定位的。 也就是说,无论你想做什么,首先要找到(匹配)目标行。 即使是最简单的删除行“1d”,在删除它之前也必须首先找到第一行。 所以唯一能够限制我们使用sed能力的因素是:如何匹配预期的行?

答案就是掌握基本规则,多练习! -n 选项和 p 命令是我们练习的好帮手。 -n 选项告诉 sed 仅输出那些已处理过的行。 例如,sed '1a Hello world!' test.txt命令默认会输出四行,应用-n后只会输出一行:

p 命令告诉 sed 仅输出那些匹配的行,例如命令:

$ sed -n '1p' test.txt 和命令sed -n '2,3s/Hello/Hi/gp' hello.txt

行匹配规则大致有两种:按行号匹配和按正则表达式匹配。

以下是一些按行号匹配的示例:

$ sed -n '1p' test.txt                 # 匹配第一行
$ sed -n '$p' test.txt                 # 匹配最后一行
$ sed -n '2,3p' test.txt               # 匹配第二行和第三行
$ sed -n '3,$p' test.txt               # 匹配第三行和第三行后的每一行

下面是通过正则表达式进行匹配的示例:

$ sed -n '/Hello/p' hello.txt

默认匹配区分大小写,要忽略大小写,可以使用 I(大写字母 i)

$ sed -n '/hello/Ip' hello.txt

以下是正则表达式匹配后执行的操作示例:

$ sed '/Hello/d' hello.txt                # 找到匹配的行,并删除
$ sed '/Hello/a world!' hello.txt         # 找到匹配的行,并在它们下面添加新行
$ sed 's/world/China/g' hello.txt         # 把行中的 world 替换为 China
$ sed '/Hello/s/world/China/g' hello.txt  # 找到匹配的行,在这些行中执行替换

以下示例使用正则表达式替换整行的内容:

$ sed -i 's/^commonName.*/commonName = xxx/g' my.cnf
$ sed -i 's/^subjectAltName.*/subjectAltName = DNS:xxx/g' my.cnf

总结

sed 是一个强大的文本替换工具,特别是在自动化场景中需要时。 本文通过示例详细介绍了如何使用 sed。 希望对大家理解和使用sed有所帮助。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON