sed是GNU/Linux的一个有用的文本处理功能。sed的完整形式是流编辑器。使用sed命令可以非常容易地完成许多类型的简单和复杂的文本处理任务。通过使用带sed命令的正则表达式,可以搜索、替换和删除文本或文件中的任何特定字符串。但此命令会临时执行所有类型的修改,并且默认情况下不会更改原始文件内容。如果需要,用户可以将修改后的内容存储到另一个文件中。“sed”命令的基本用法将在本教程中使用50个独特的示例进行解释。在开始本教程之前,您必须通过运行以下命令检查操作系统中已安装的“sed”版本。本教程是基于GNU sed设计的。因此,练习本教程中显示的示例需要使用此版本的“sed”。
sed—版本
以下输出显示系统中安装了版本为4.4的GNU Sed。
语法:
sed[选项]…[脚本][文件]
如果“sed”命令没有提供文件名,则脚本将处理标准输入数据。sed脚本可以在没有任何选项的情况下执行。
所容纳之物
- 使用“sed”的基本文本替换
- 使用“g”选项替换文件特定行中文本的所有实例
- 仅替换每行上第二次出现的匹配项
- 仅替换每行上最后一次出现的匹配项
- 用新文本替换文件中的第一个匹配项
- 用新文本替换文件中的最后一个匹配项
- 在替换命令中转义反斜杠以管理文件路径的搜索和替换
- 将所有文件的完整路径替换为仅文件名无目录
- 替换文本,但前提是在字符串中找到其他文本
- 替换文本,但前提是在字符串中找不到其他文本
- 使用“1”在匹配模式前后添加字符串
- 删除匹配行
- 删除匹配行和匹配行后的2行
- 删除文本行末尾的所有空格
- 删除行上有两次匹配的所有行
- 删除所有只有空白的行
- 删除所有不可打印的字符
- 如果行中有匹配项,请在行的末尾添加一些内容
- 如果行中有匹配项,请在匹配项之前插入行
- 如果行中有匹配项,请在匹配项之后插入行
- 如果没有匹配项,请在行尾添加一些内容
- 如果不匹配,则删除该行
- 在文本后添加空格后重复匹配的文本
- 将字符串列表中的一个字符串替换为其他列表中的新字符串
- 将匹配的字符串替换为包含换行符的字符串
- 从文件中删除换行符,并在每行末尾插入一个逗号
- 删除逗号并添加换行符以将文本拆分为多行
- 查找不区分大小写的匹配项并删除行
- 查找不区分大小写的匹配项并替换为新文本
- 查找不区分大小写的匹配项,并替换为相同文本的所有大写字母
- 查找不区分大小写的匹配项,并替换为相同文本的所有小写字母
- 将文本中的所有大写字符替换为小写字符
- 搜索行中的数字,并在数字后面附加货币符号
- 在超过3位的数字中添加逗号
- 将制表符替换为4个空格字符
- 用制表符替换4个连续空格字符
- 将所有行截断为前80个字符
- 搜索字符串regex并在其后面附加一些标准文本
- 搜索一个字符串正则表达式和在它之后找到的字符串的第二个副本
- 从文件中运行多行“sed”脚本
- 匹配多行模式并替换为新的多行文本
- 替换与模式匹配的两个单词的顺序
- 从命令行使用多个sed命令
- 将sed与其他命令结合使用
- 在文件中插入空行
- 从文件的每一行中删除所有字母数字字符。
- 使用“&”匹配字符串
- 切换成对的单词
- 将每个单词的第一个字符大写
- 打印文件的行号
1.使用sed的基本文本替换
使用sed命令,可以使用搜索和替换模式来搜索和替换文本的任何特定部分。在以下示例中,“s”表示搜索和替换任务。单词“Bash”将在文本“Bash Scripting Language”中搜索,如果该单词存在于文本中,则它将被单词“Perl”取代。
echo“Bash脚本语言”|sed的s/Bash/Perl/'
在该执行的输出中,文本中存在单词“Bash”。所以输出是“Perl脚本语言”。
sed命令也可以用于替换文件内容的任何部分。创建一个名为weekday.txt的文本文件,其中包含以下内容:
$cat weekday.txt
星期一
星期二
星期三
星期四
星期五
星期六
星期日
以下命令将搜索文本“Sunday”并将其替换为文本“Sundayis holiday”。
sed的/周日/周日是假日/'weekday.txt
在该执行的输出中,weekday.txt文件中存在“Sunday”,并且在执行上述sed命令后,该单词被文本“Sunday is holiday”替换。
转到顶部
2.使用“g”选项替换文件特定行中文本的所有实例
sed命令中使用“g”选项来替换所有匹配模式的出现。创建一个名为python.txt的文本文件,其中包含以下内容,以了解“g”选项的用法。此文件多次包含单词“Python”。
$cat python.txt
Python是一种非常流行的语言。
Python很容易使用。Python很容易学习。
Python是一种跨平台语言
以下命令将替换文件Python.txt第二行中出现的所有“Python”。这里,“Python”在第二行出现两次。
sed'2s/Python/perl/g'Python.txt
运行脚本后将出现以下输出。这里,第二行中所有出现的“Python”都被“Perl”替换。
转到顶部
3.只替换每行上第二次出现的匹配项
如果任何单词在文件中多次出现,则可以使用具有出现次数的sed命令来替换每行中该单词的特定出现次数。以下sed命令将替换文件python.txt每行中第二次出现的搜索模式。
sed的s/Python/perl/g2'Python.txt
运行上述命令后,将出现以下输出。在这里,搜索文本“Python”仅在第二行出现两次,并被文本“Perl”替换:
转到顶部
4.只替换每行上最后一次出现的匹配项
创建一个名为“lang.txt”的文本文件,其中包含以下内容。
$cat lang.txt
Bash编程语言。Python编程语言。Perl编程语言。
超文本标记语言。
可扩展标记语言。
要用“Scripting”只替换行上最后一个“Programming”实例,请按如下方式运行sed命令:
sed的/(.*)编程/1脚本/'lang.txt
要理解此命令,请注意此sed命令中的模式匹配:(.*)编程,将创建一个捕获组,其中所有文本以贪婪的方式与该行匹配,直到编程的最后一个实例为止。此捕获组存储为“ 1”,并在sed: 1脚本的替换部分中引用。因此,直到最后一个“编程”实例为止的整行匹配将再次包含在替换行中,并以“脚本”字结束该行。这是使其工作的技术,如输出所示:
转到顶部
5.用新文本替换文件中的第一个匹配项
以下命令将仅用文本“perl”替换搜索模式的第一个匹配项“Python”。这里,“1”用于匹配模式的第一次出现。
sed'1s/Python/perl/'Python.txt
运行上述命令后,将出现以下输出。在这里第一行中第一个出现的“Python”被“perl”替换。
转到顶部
6.用新文本替换文件中的最后一个匹配项
以下命令将用文本“Bash”替换上次出现的搜索模式“Python”。这里,“$”符号用于匹配模式的最后一次出现。
sed-e'$s/Python/Bash/'Python.txt
运行上述命令后,将出现以下输出:
转到顶部
7.在替换命令中转义反斜杠以管理文件路径的搜索和替换
为了进行搜索和替换,有必要对文件路径中的反斜杠进行转义。sed的以下命令将在文件路径中添加反斜杠()。
echo/home/ubuntu/code/perl/add.pl|sed的;/;\/;g'
文件路径“/home/ubuntu/code/perl/add.pl”作为sed命令中的输入提供,运行上述命令后将出现以下输出:
转到顶部
8.将所有文件的完整路径替换为文件名无目录
使用basename命令可以很容易地从文件路径中检索文件名。sed命令也可以用于从文件路径中检索文件名。以下命令将仅从echo命令提供的文件路径中检索文件名。
echo“/home/ubuntu/temp/myfile.txt”|sed的/.*///'
运行上述命令后,将出现以下输出。在这里,文件名“myfile.txt”被打印为输出。
转到顶部
9.替换文本,但前提是在字符串中找到其他文本
创建一个名为“dept.txt”的文件,其中包含以下内容,以替换基于其他文本的任何文本:
dept.txt
$cat dept.txt
学生总数列表:
CSE-计数
EEE-计数
Civil-计数
以下sed命令中使用了两个replace命令。这里,在包含文本“CSE”的行中,文本“Count”将被“100”替换,而在包含搜索模式“EEE”的行将文本“Count”替换为“70”。
sed-e'/CSE/s/计数/100//EEE/s/计数/70/;'dept.txt
运行上述命令后,将出现以下输出:
转到顶部
10.替换文本,但前提是在字符串中找不到其他文本
以下sed命令将替换不包含文本“CSE”的行中的“Count”值。dept.txt文件包含两行,其中不包含文本“CSE”。因此,“计数”文本将在两行中替换为80。
sed-i-e'/CSE/!s/计数/80/;'dept.txt
输出
运行上述命令后,将出现以下输出:
转到顶部
11.使用'1'在匹配模式前后添加字符串
“sed”命令的匹配模式序列由“1”、“2”等表示。下面的sed命令将搜索模式“Bash”,如果模式匹配,则在替换文本的部分由“ 1”访问。在这里,在输入文本中搜索文本“Bash”,在“1”之前添加一个文本,在“ 1”之后添加另一个文本。
echo“Bash language”|sed的/(Bash)/Relearn1编程/'
运行上述命令后,将出现以下输出。此处“学习”文本添加在“Bash”之前,“编程”文本添加到“Bassh”之后。
转到顶部
12.删除匹配行
sed命令中使用了“d”选项来删除文件中的任何行。创建一个名为“os.txt”的文件,并添加以下内容来测试“d”选项的功能。
$cat os.txt
窗户
Linux
安卓
OS
以下sed命令将从包含文本“os”的“os.txt”文件中删除这些行:
sed'/OS/d'OS.txt
运行上述命令后,将出现以下输出:
转到顶部
13.删除匹配行和匹配行后的2行
如果找到模式“Linux”,以下命令将从文件os.txt中删除三行。os.txt在第二行包含文本“Linux”。因此,这一行和接下来的两行将被删除。
sed'/Linux/,+2d'os.txt
运行上述命令后,将出现以下输出:
转到顶部
14.删除文本行末尾的所有空格
使用[:blank:]类可以用于从任何文件的文本或内容中删除空格和制表符。以下命令将删除文件“os.txt”每行末尾的空格。由于本例为空白空白,我们将首先查看使用Nano和Alt-P显示空白的文件的屏幕截图:
现在,我们可以运行下面的示例sed命令来删除每行末尾的空白。我们将使用-i命令行对本例进行就地文件编辑/更新,以永久进行更改:
sed-i的/[[:blank:]]*$//'os.txt
现在,我们可以使用nano-Alt-p选项再次查看文件,以查看从行尾删除的空白:
转到顶部
15.删除所有行中有两次匹配的行
在本例中,我们首先创建一个名为“input.txt”的文本文件,其中包含以下内容。此示例代码将两次删除包含搜索模式的文件中的那些行。
$cat input.txt
PHP是一种服务器端脚本语言。
PHP是一种开源语言,并且区分大小写。
PHP是独立于平台的。PHP更快。
本例中使用了两个sed命令来两次删除那些包含模式“php”的行。第一个sed命令将用“dl”替换每行中第二个出现的“php”。然后,我们将第一个sed输出作为输入管道传输到第二个sed命令中。第二个sed命令将删除那些包含特殊信号文本“dl”的行“dl”在本例中用作“delete line”的信号,但文本中可能也包含“dl”,因此这有点危险。对于生产系统,可以考虑使用“aNh4JPrSf3EXmdkKDpyz8K5u”这样的代码,而不是“dl”,这样可以更随机,或者是您为避免事故而创建的更花哨的技巧。
sed的/php/dl/i2;t'input.txt | sed'/dl/d'
对于这个示例输出,文件“input.txt”有两行,其中包含两次模式“php”。因此,运行上述命令后将出现以下输出:
转到顶部
16.删除所有只有空白的行
对于这个例子,我们在内容中添加了一些空行,以在文件“input.txt”中测试这个例子。这里,“^$”用于查找文件“input.txt”中的空行。
$cat input.txt
PHP是一种服务器端脚本语言。
PHP是一种开源语言,并且区分大小写。
PHP是独立于平台的。PHP更快。
现在我们运行sed命令来删除空行:
sed'/^$/d'input.txt
运行上述命令后,将出现以下输出:
转到顶部
17.删除所有不可打印的字符
通过将不可打印字符替换为无字符,可以从任何文本中删除不可打印的字符。[:print:]类在本例中用于查找不可打印的字符。't'是不可打印的字符,echo命令无法直接解析它。为此,在回显命令中使用的变量$tab中分配了“t”字符。echo命令的输出在sed命令中发送,该命令将从输出中删除字符“t”。
$tab=$'tt
$echo你好“$tab”世界
$echo Hello“$tab”世界|sed的/[^[:打印:]]//g'
运行上述命令后,将出现以下输出。第一个echo命令将使用选项卡空间打印输出,sed命令将在删除选项卡空间后打印输出。
转到顶部
18.如果行中有匹配项,请在行的末尾添加一些内容
请确保您有一个包含以下内容的文件“os.txt”:
$cat os.txt
窗户
Linux
安卓
OS
以下命令将在“os.txt”文件中包含文本“Windows”的行的末尾附加“10”:
sed'/Windows/s/$/10/'os.txt
运行命令后将显示以下输出:
转到顶部
19.如果行中有匹配项,请在文本前插入一行
对于此示例,请确保您有“input.txt”:
$cat input.txt
PHP是一种服务器端脚本语言。
PHP是一种开源语言,并且区分大小写。
PHP是独立于平台的。PHP更快。
以下sed命令将在“input.txt”文件中搜索文本“PHP与平台无关”。如果文件中包含此文本,则会在该行之前插入“PHP是一种解释语言”。
sed’/PHP是独立于平台的/s/^/PHP是一种解释语言。n/'input.txt
运行上述命令后,将出现以下输出:
转到顶部
20.如果行中有匹配项,则在该行之后插入一行
下面的sed命令将搜索文件“os.txt”中的文本“Linux”,如果文本存在于任何一行中,则会在该行之后插入新的文本“Ubuntu”。首先创建“os.txt”文件:
$cat os.txt
窗户
Linux
安卓
OS
sed的/Linux/&nBunntu/'os.txt
运行上述命令后,将出现以下输出,添加的换行符插入新文本,并保留“&”特殊变量中的所有旧文本(包括整个匹配项):
转到顶部
21.如果没有匹配项,请在行尾添加一些内容
以下sed命令将搜索“os.txt”中不包含文本“Linux”的行,并在这些行的末尾附加文本“操作系统”。这里,“$”符号用于标识新文本将被替换的行的末尾。请确保您有一个“os.txt”文件:
$cat os.txt
窗户
Linux
安卓
OS
然后运行命令:
sed'/Linux/!s/$/操作系统/'os.txt
运行上述命令后,将出现以下输出。文件os.txt中有三行不包含文本“Linux”,新文本添加在这些行的末尾。
转到顶部
22.如果不匹配,删除该行
创建一个名为“web.txt”的文件,并添加以下内容。
$cat web.txt
HTML 5
Javascript
CSS
PHP
MySQL
JQuery
此sed命令将删除不包含匹配图案的行。
sed'/CSS/!d'web.txt
运行上述命令后,将出现以下输出。文件中有一行包含文本“CSS”。因此,输出仅包含一行。如果您将模式从“CSS”更改为“J”,您将看到2行输出。
sed’/J/!d'web.txt
转到顶部
23.在文本后面添加空格后复制匹配的文本
以下sed命令将在文件“python.txt”中搜索匹配的单词“very”,如果该单词存在,则将再次插入相同的单词作为重复单词。这里,“&”符号表示匹配文本,我们将其添加两次以进行重复。确保您有“python.txt”:
$cat python.txt
Python是一种非常流行的语言。
Python很容易使用。Python很容易学习。
Python是一种跨平台语言
这是代码:
sed-e's/very/&&/g'python.txt
运行命令后将出现以下输出。你可以看到,我们复制了“非常”,使其“非常非常”:
转到顶部
24.将一个字符串列表替换为另一个列表中的新字符串
您必须创建两个列表文件来测试此示例。创建两个名为“list1.txt”和“list2”的文本文件,并添加以下内容。
$cat list1.text
1001:贾法尔·阿里
1023:Nir Hossain
1067年:约翰·米歇尔
$cat list2.txt
1001 CSE GPA-3.63
1002 CSE GPA-3.24
1023 CSE GPA-3.11
1067 CSE GPA-3.84
我们将把这个过程分解成几个小步骤,使其从复杂变为简单。sed可以将替换命令列表作为文件输入,因此我们的方法是首先使用's'替换运算符创建一个包含相关sed语法替换命令列表的文件。以下是使用另一个低复杂度的名为awk的linux命令创建命令文件的简单代码。请注意,这是一个原始文件的cat,通过管道传输到awk,输出重定向到“command.txt”:
cat list1.text|awk-F:'{printf(“s/%s/%s/n”,$1,$2)}'>命令.txt
通过创建“command.txt”文件,我们可以使用基本的sed命令在“list2.txt”上轻松运行此替换列表:
sed-f command.txt list2.txt
下面的输出显示了替换匹配键和值以及otuput的两个步骤的过程:
转到顶部
25.将匹配的字符串替换为包含换行符的字符串
以下命令将从echo命令中获取输入,并在文本中搜索单词“Python”。如果该单词存在于文本中,则会在新文本中插入一个新文本“添加的文本”,并在其中插入一行换行符。以下是示例代码:
echo“Bash Perl Python Java PHP ASP”|sed的s/Python/Added Textn/'
插入新文本和换行符。运行上述命令后,将出现以下输出:
转到顶部
26.从文件中删除换行符,并在每行末尾插入一个逗号
以下sed命令将用逗号替换文件“os.txt”中的每一个换行符。
$cat os.txt
窗户
Linux
安卓
OS
这里,“-z”选项用于指示sed使用每行分隔的NULL字符而不是换行符来解释输入,这允许在不受干扰的情况下进一步操作文本中的换行符。然后,我们用逗号简单地替换所有换行符“n”:
sed-z's/n/,/g'os.txt
运行上述命令后将出现以下输出,请注意缺少终止换行符,这可能是您的用例所需要的,也可能不是:
转到顶部
27.删除逗号并添加换行符,将文本拆分为多行
以下sed命令将以echo命令中以逗号分隔的行作为输入,并将所有逗号替换为换行符。
echo“Kaniz Fatema,30th,batch”|sed“s/,/n/g”
运行上述命令后,将出现以下输出。输入文本包含三个逗号分隔的数据,这些数据被换行符替换并分三行打印:
转到顶部
28.查找不区分大小写的匹配项并删除行
sed命令中的'I'指示符用于表示忽略大小写的不区分大小写的匹配。下面的sed命令将使用不区分大小写的搜索来搜索包含单词“linux”的行,并从输出中删除该行。设置你的“os.txt”,首先注意大写:
$cat os.txt
窗户
Linux
安卓
OS
然后运行sed命令:
sed'/linux/Id'os.txt
运行上述命令后将出现以下输出。'“os.txt”包含单词“Linux”,该单词与模式匹配,“Linux”表示不区分大小写的搜索,并被删除:
转到顶部
29.查找不区分大小写的匹配项并替换为新文本
以下sed命令将从echo命令中获取输入,并使用命令末尾的不区分大小写指示符“i”将单词“bash”替换为单词“PHP”。
echo“我喜欢bash编程”|sed的s/bash/PHP/I'
运行上述命令后,将出现以下输出。这里,单词“Bash”与单词“Bash”匹配,表示不区分大小写的搜索,并替换为单词“PHP”。
转到顶部
30.查找不区分大小写的匹配项,并替换为相同文本的所有大写字母
sed中使用'U'将任何文本转换为全大写字母。下面的sed命令将在“os.txt”文件中搜索单词“linux”,如果该单词存在,它将用所有大写字母替换该单词。首先创建“os.txt”文件。
$cat os.txt
窗户
Linux
安卓
OS
现在是要运行的命令:
sed的/(linux)/U1/Ig的os.txt
此命令使用sed捕获组(linux)被捕获在 1中,以便在替换中重用。在我们的示例中,'U'与'1'一起使用,以使捕获的匹配转换为大写。还要注意指令末尾的“Ig”命令,它强制执行不区分大小写的全局匹配。运行上述命令后,将出现以下输出。“os.txt文件”中的“Linux”一词替换为“Linux”一词:
转到顶部
31.查找不区分大小写的匹配项,并替换为相同文本的所有小写字母
与前面的大写示例类似,我们将进行不区分大小写的搜索,并将匹配的文本全部替换为小写。
$cat os.txt
窗户
Linux
安卓
OS
sed中使用'L'将任何文本转换为所有小写字母,我们再次使用捕获组来查找(linux)的匹配文本,并存储为'1'以用于小写。以下是命令:
sed的/(linux)/L1/Ig的os.txt
运行上述命令后,将出现以下输出。此处的单词“Linux”替换为单词“Linux”:
转到顶部
32.将文本的所有大写字符替换为小写字符
以下sed命令将搜索文件“os.txt”中的所有字符,并使用“L”将这些字符替换为小写字母。
以下是数据文件:
$cat os.txt
窗户
Linux
安卓
OS
下面是要运行的sed命令:
sed的s/(.*)/L1/'os.txt
运行上述命令后将出现以下输出,请注意,这是有效的,因为我们创建了一个捕获组“1”并对其使用小写命令:“L”。
转到顶部
33.搜索行中的数字,并在数字前附加任何货币符号
创建一个名为“items.txt”的文件,其中包含以下内容:
$cat项目.txt
HDD 100
监视器80
鼠标10
以下sed命令将在“items.txt”文件的每一行中搜索第一个匹配的数字,并在每个数字之前附加货币符号“$”。
$cat项目.txt
$sed的s/([0-9])/$1/'items.txt
运行上述命令后,将出现以下输出。在这里,“$”符号被添加到每一行的编号之前。注意,我们不使用“g”表示全局,我们只匹配第一个数字,如果示例需要每行包含多个多位数,则需要更复杂的解决方案。
转到顶部
34.在超过3位的数字中添加逗号
下面的sed命令将从echo命令中获取一个数字作为输入,并在从右边开始计数的每组三位数字后添加一个逗号。这里,“:a”表示标签,当匹配为true时,“ta”用于有条件地迭代标签“a”上的分组过程。
echo“5098673”|sed-e:a-e的/(.*[0-9])([0-9]{3})/1,2/;ta’
编号5098673在echo命令中给出。它是一个子站点命令,具有用“ta”引用的条件标签“a”。搜索模式是任意一位数字,后面正好跟有3位数字。找到替换模式时,捕获组“1”由“,”和捕获组“ 2”分隔。因此,循环是通过产生输出的整个字符串来完成的:
转到顶部
35.将制表符替换为4个空格字符
以下sed命令将用四个空格字符替换每个制表符。'sed命令中使用t'符号来匹配制表符,使用'g'全局替换所有匹配项。这是代码:
echo-e“1t2t3”|sed$'s/t//g'
运行上述命令后,将出现以下输出:
让我们看第二个使用Nano和Alt-P替换选项卡的例子,以显示前后可见的空白。
文件之前:
sed命令:
sed的s/t//g'input.txt>output.txt
替换后的文件:
转到顶部
36.用制表符替换4个连续空格字符
与上面的示例35正好相反,我们将在用连续空格替换之前显示一个文本文件,然后使用“t”ascii代码替换制表符。
如下所示的Before和After文件,请注意Nano的“Alt-P”可以显示空白标记:
用小点表示的空白
由彩色小标记指示的选项卡
以下是本例中用于将4个空格替换为制表符的命令:
sed-e's//t/g'input.txt>output.txt
转到顶部
37.将所有行截断为前80个字符
创建一个名为input.txt的文本文件,其中包含超过80个字符的行以测试此示例。
linuxhint@u20:~$cat input.txt
PHP是一种服务器端脚本语言。
PHP是一种开源语言,并且区分大小写。
PHP是独立于平台的。PHP更快。我喜欢说很多话,讨厌被打断:)
sed的/(^.{1,80}).*/1/'输入.txt
运行上述命令后,将出现以下输出,我们剪掉长行:
linuxhint@u20:~$sed的s/(^.{1,80}).*/1/'输入.txt
PHP是一种服务器端脚本语言。
PHP是一种开源语言,并且区分大小写。
PHP是独立于平台的。PHP更快。我喜欢说很多话,讨厌当我
linuxhint@u20:~$
转到顶部
38.搜索字符串regex并在其后面附加一些标准文本
下面的sed命令将搜索输入文本中的文本“hello”,并在该文本后面附加文本“John”。
echo“你好,你好吗?”|sed的/(hello)/1 John/
此代码使用替换字符串中引用为“1”的捕获组“(hello)”来工作。运行上述命令后将出现以下输出:
linuxhint@u22:~$echo“你好吗?”|sed的/(hello)/1 John/
你好,约翰,你好吗?
linuxhint@u22:~$
转到顶部
39.搜索字符串regex,并在每行的第二个匹配项后附加一些文本
您可能希望仅在每行第二个(或其他数字)匹配时替换字符串。让我们创建一个数据文件“input.txt”:
linuxhint@u22:~$cat input.txt
PHP是一种服务器端脚本语言。
PHP是一种开源语言,并且区分大小写。
PHP是独立于平台的。PHP更快。
下面的sed命令将在“input.txt”的每行中搜索文本中的“PHP”,并将每行中的第二个匹配项替换为文本“New text Added”。
sed的/(PHP)/1(添加了新文本)/2'input.txt
运行上述命令后,将出现以下输出。搜索文本“PHP”在“input.txt”文件的第二行和第三行出现两次。因此,在第二次匹配后的第二行和第三行插入文本“添加了新文本”:
转到顶部
40.从文件运行多行sed脚本
多个sed命令可以存储在一个文件中,所有命令都可以通过运行sed命令一起执行。为了证明这一点,请确保您有“input.txt”:
linuxhint@u22:~$cat input.txt
PHP是一种服务器端脚本语言。
PHP是一种开源语言,并且区分大小写。
PHP是独立于平台的。PHP更快。
创建一个名为“sedcmd”的文件,并添加以下内容:
s/PHP/ASP/
s/独立/依赖/
上面,文件中添加了两个sed命令。一个命令将文本“PHP”替换为“ASP”,另一个命令则将文本“独立”替换为文本“依赖”。sed命令中使用了“-f”选项来执行文件中的所有命令。
sed-f sedcmd input.txt
运行以上命令后,将显示以下输出:
转到顶部
41.匹配多行模式并替换为新的多行文本
下面的sed命令将搜索多行文本“LinuxnAndroid”,如果模式匹配,则匹配的行将被新的多行文本”UbuntunAndroidLollipop“替换。”os.txt的数据文件在这里:
$cat os.txt
窗户
Linux
安卓
OS
sed命令在这里:
sed'$!Ns/LinuxnAndroid/UbuntunAndroid棒棒糖/;PD'os.txt
这里,P和D用于多行处理。运行上述命令后,将出现以下输出:
转到顶部
42.替换文本中与模式匹配的两个单词的顺序
下面的sed命令将从echo命令中获取两个单词的输入,并替换这些单词的顺序。
echo“perl-python”|sed-e的/([^]*)*([^]*)/21/'
此代码使用两个捕获组来获得用空格分隔的第一个和第二个单词,然后在输出中反转捕获组的顺序:“2”“1”。以下是输出:
linuxhint@u22:~$echo“perl-python”|sed-e的/([^]*)*([^]*)/21/'
python perl
linuxhint@u22:~$
转到顶部
43.从命令行执行多个sed命令
“-e”与用分号分隔的多个sed命令组合时,可以组合在一起。下面的sed命令将从echo命令中获取文本作为输入,并将“Ubuntu”替换为“Kubuntu”,将“Centos”替换为”Fedor“。
$echo“Ubuntu Centos Debian”|sed-e's/Ubuntu/Kubuntu/;s/Centos/Fedora/'
注意,由于分隔分号,多个“s/”命令与一个sed组合在一起。运行上述命令后将出现以下输出,“Ubuntu”和“Centos”将被“Kubuntu”和“Fedora”替换:
转到顶部
44.将sed与其他命令相结合
以下命令将sed命令与cat命令结合使用。在本例中,cat命令用于生成到stdout的输出。第一个sed命令将从“os.txt”文件中获取输入,并在将文本“Linux”替换为“Fedora”后将命令的输出发送给第二个sed命令。第二个sed命令将文本“Windows”替换为“Windows 10”。这3个命令与linux管道相结合。
这是“OS.txt”文件:
$cat os.txt
窗户
Linux
安卓
OS
下面是要运行的命令:
cat os.txt |sed的/Linux/Fedora/'|sed的/windows/windows 10/i'
运行上述命令后,将出现以下输出:
转到顶部
45.在文件中插入空行
创建一个名为“stdlist”的文件,其中包含以下内容:
$cat标准列表
#ID#姓名
[101]-阿里
[102]-尼哈
sed的“G”选项用于在文件中的每一行之后插入空行。您可以将其视为将单间距文件转换为双间距文件,每一行之间都有一个空行。以下是命令示例:
sed G标准列表
运行上述命令后,将出现以下输出。在文件的每一行之后插入一个空行:
linuxhint@u22:~$sed G标准列表
#ID#姓名
[101]-阿里
[102]-尼哈
linuxhint@u22:~$
转到顶部
46.在文件的每一行中用空格替换所有字母数字字符。
以下命令将用空格替换“stdlist”文件中的所有字母数字字符,该文件的内容如下所示:
$cat标准列表
#ID#姓名
[101]-阿里
[102]-尼哈
此sed命令的工作原理是匹配大写、小写以及整数的所有字母字符,并使用sed的“s”替换命令和“g”全局修饰符:
sed的/[A-Za-z0-9]//g'标准列表
运行上述命令后,将出现以下输出:
linuxhint@u22:~$sed的/[A-Za-z0-9]//g'标准列表
# #
[] -
[] -
linuxhint@u22:~$
转到顶部
47.使用“&”打印匹配的字符串
以下命令将搜索以“L”开头的单词,并通过使用“&”符号将“Matched String is-”附加为匹配的单词来替换文本。在本例中,“p”用于打印修改后的文本。“os.txt”文件用于以下内容:
$cat os.txt
窗户
Linux
安卓
OS
这是命令,请注意用于表示行首的“^”:
sed-n的/^L/匹配字符串为-&&/p'os.txt
请注意,使用“p”命令时,输出中仅打印匹配的行:
转到顶部
48.切换文件中的成对单词
创建一个名为“course.txt”的文本文件,其中包含以下内容,每行包含一对单词:
$cat课程.txt
PHP ASP
MySQL Oracle
CodeIgniter Laravel
以下命令将切换文件“course.txt”每行中的成对单词
sed的/([^]*)*([^]*)/21'course.txt
切换每行中的成对单词后,将出现以下输出。这是一组由2个捕获组组成的集合,它们在的'替换的输出中反转:
转到顶部
49.将每个单词的第一个字符大写
下面的sed命令将从echo命令中获取输入文本,并将每个单词的第一个字符转换为大写字母。该命令具有2个捕获组,并且仅将第一个捕获组大写:
echo“我喜欢bash编程”|sed的/([a-z])([a-zA-Z0-9]*)/u12/g'
运行上述命令后,将出现以下输出。输入文本“I like bash programming”在将第一个单词大写后打印为“I like bash programming”:
转到顶部
50.打印文件的行号
假设我们想在如下所示的示例文件中打印行号:
$cat os.txt
窗户
Linux
安卓
OS
sed命令中使用“=”符号在文件的每一行之前打印行号。以下命令将打印带有行号的“os.txt”文件的内容:
sed'='os.txt
运行上述命令后,将出现以下输出。“os.txt”文件中有四行。行号打印在文件的每一行之前:
转到顶部
结论
本教程中使用非常简单的示例来解释sed命令的不同用法。这里提到的所有sed脚本的输出都是临时生成的,原始文件的内容保持不变。但如果需要,可以使用sed命令的-i或-in-place选项修改原始文件。如果你是一个新的Linux用户,并且想学习sed命令执行各种类型的字符串操作任务的基本用法,那么本教程将对你有所帮助。
常见问题
sed命令的用途是什么?
sed命令有许多不同的用途。也就是说,主要用法是替换文件中的单词,或者查找和替换。sed的伟大之处在于,你可以在文件中搜索单词并替换它,但你甚至不必打开文件——sed只是为你做这一切!除此之外,它还可以用于删除。你所需要做的就是在sed中键入你想要查找、替换或删除的单词,它会为你显示出来——然后你可以选择替换该单词或从文件中删除该单词的所有痕迹。sed是一个极好的工具,可以替换IP地址和任何你不想放在文件中的高度敏感的东西。sed是任何软件工程师、系统管理员或开发操作工程师都必须知道的!
sed命令中的s和g是什么?
用最简单的术语来说,可以在sed中使用的“s”函数的意思就是“替换”。键入“s”后,您可以替换或替换任何您想要的内容——只需键入“s’”将只替换单词在一行中的第一个出现。在sed命令的末尾指定“g”修饰符将进行全局替换(这就是g所代表的)。考虑到这一点,如果您指定“g”,它将用“s”替换您选择的单词的每次出现,而不仅仅是第一次出现的默认行为。
如何运行sed脚本?
您可以通过多种方式运行sed脚本,但最常见的是在命令行上。在这里,您只需指定sed和要对其使用命令的文件。这允许您对该文件使用sed,允许您根据需要查找、删除和替换。你也可以在shell脚本中使用它,这样你就可以将你想要的任何东西传递给脚本,它会为你运行find和replace命令。这对于不想在脚本中指定高度敏感的数据非常有用,因此可以将其作为变量传入。
sed中的捕获组是什么
捕获组允许程序员创建正则表达式来查找匹配的文本,然后将这些匹配作为指定的变量来对替换的输出中的进行操作,如更改输出的顺序、使用大写命令进行修改或任何其他sed修改。捕获组允许以复杂的方式捕获和重用与模式匹配的动态文本。