首页 > 系统相关 >Linux三剑客-sed

Linux三剑客-sed

时间:2023-11-26 17:34:35浏览次数:44  
标签:子串 匹配 echo sed Linux expression 替换 三剑客

今天继续介绍Linux三剑客中的sed

sed是stream editor(流编辑器)的缩写。它最常见的用法是进行文本替换。下面介绍一些sed的常见用法。

sed最常见的功能,是用它进行文本替换。它的替换形式和vim非常相似,具体语法如下:

 $ sed 's/pattern/replace_string/' file

其中pattern代表替换用的模式串,replace_string代表被替换的字符串。sed命令不改变原有的文件,如果想要直接替换原来的文件, 需要使用-i选项。

 $ sed -i 's/text/replace/' file

前面的例子只能替换了每行中模式首次匹配的内容。要实现全局替换必须使用g标记。

 $ sed 's/pattern/replace_string/g' file

/#g标记可以使sed替换第N次出现的匹配:

$ echo thisthisthisthis | sed 's/this/THIS/2g'
thisTHISTHISTHIS

$ echo thisthisthisthis | sed 's/this/THIS/3g'
thisthisTHISTHIS

$ echo thisthisthisthis | sed 's/this/THIS/4g'
thisthisthisTHIS

sed还可以用来对文本进行处理,例如删除空行。行可以用正则表达式 ^$ 进行匹配,用/d告诉sed不执行替换操作,而是直接删除匹配到的空行。

$ sed '/^$/d' file

注意这里开头没有s。

在sed中,我们可以用&指代模式所匹配到的字符串,这样就能够在替换字符串时使用已匹配的内容。例如下面这个例子:

 $ echo this is an example | sed 's/\w\+/[&]/g'
 [this] [is] [an] [example]

&指代匹配给定模式的字符串。我们还可以使用\#来指代出现在括号中的部分正则表达式(注:子模式)所匹配到的内容:

$ echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number

这条命令将digit 7替换为7。\(pattern\)用于匹配子串,在本例中匹配到的子串是7。子模式被放入使用反斜线转义过的()中。对于匹配到的第一个子串,其对应的标记是\1,匹配到的第二个子串是\2,往后以此类推。我们还可以对这些匹配到的子串进行处理。

$ echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
EIGHT seven

上面这条命令中,\1匹配得到单词seven,\2匹配得到单词\EIGHT。在替换部分,它们的次序被更改为\2 \1,因此就呈现出了逆序的结果。

sed可以组合多个表达式来对文本进行替换,有三种表示方法:

$ sed 'expression' | sed 'expression' # 第一种
$ sed 'expression; expression' #第二种
$ sed -e 'expression' -e 'expression' # 第三种

它们使用的效果是相同的。

$ echo abc | sed 's/a/A/' | sed 's/c/C/'
AbC
$ echo abc | sed 's/a/A/;s/c/C/'
AbC
$ echo abc | sed -e 's/a/A/' -e 's/c/C/'
AbC

另外,在sed的表达式中可以使用变量,这时需要使用双引号。

$ text=hello
$ echo hello world | sed "s/$text/HELLO/"
HELLO world

 

标签:子串,匹配,echo,sed,Linux,expression,替换,三剑客
From: https://www.cnblogs.com/xyhj/p/17852770.html

相关文章

  • linux之进程控制(万字长文详解)
    进程控制进程创建——fork函数用于创建子进程的系统调用接口!这是一个函数函数执行前只有一个父进程,函数执行后有一个父进程一个子进程进程调用fork,当控制转移到内核中的fork代码后,内核做分配新的==内存块和内核数据结构(PCB,地址空间,页表)==给子进程将父进程部分数据结构内......
  • 无涯教程-Linux - 条件判断
    在本章中,我们将了解Unix中的Shell判断语句。if...else语句case...esac语句if...else语句UnixShell支持以下形式的if…else语句-if...fi语句if...else...fi语句if...elif...else...fi语句CASE...ESAC声明您可以使用多个if...elif......
  • Linux学习随笔——进程管理
    一、查看进程1.静态进程ps:命令可以查看静态进程,类似给进程制作快照;psaux命令可以查看当前目录的进程;psaux--sort-%cpu:可以查看进程按照CPU占用百分比的降序排列;ps-ef:可以查看UID、PID、PPID等信息;psaxo:可以快速查找需要显示的内容,内容简介并且有针对性;几种常用的查看......
  • 无涯教程-Linux - 运算符
    每个Shell支持各种运算符。我们将在本章中详细讨论Bourneshell(默认Shell)。我们现在将讨论以下运算符-算术运算符关系运算符布尔运算符字符串运算符BourneShell最初没有任何执行简单算术运算的机制,但它使用外部程序,即awk或expr。以下示例显示如何将两个数字相加-#......
  • Linux I/O 重定向与管道
    1.输入/输出重定向输出重定向是一种将命令的输出流从默认位置改变到其他位置的方式。在Linux系统中,有两种常用的输出重定向符号:1.">":将命令的输出重定向到文件。这个符号将命令的输出流重定向到指定的文件中。如果文件不存在,则会创建一个新文件;如果文件已存在,则会......
  • linux - find 查找文件
    1.-name在当前目录以及子目录中根据文件名进行查找find-name"apt.md"2.-iname忽略大小写进行查找find-iname"apt.md"3.-mindepth,-maxdepth设置从根目录下查找的目录层级find/-mindepth3-maxdepth5-namepasswd4.-exec对查找到的文件执行命令find-name......
  • 无涯教程-Linux - 数组(Array)
    Shell支持另一种类型的变量,称为array变量。这可以同时保存多个值,数组提供了一种对一组变量进行分组的方法。定义数组值假设您尝试将各个学生的姓名表示为一组变量。每个单独的变量都是标量变量,如下所示-NAME01="Learnfk"NAME02="Nesfk"NAME03="Toolfk"NAME04="Poemfk"NAM......
  • 无涯教程-Linux - 特殊变量
    在本章中,我们将讨论Unix中的特殊变量,在上一章中,我们了解了变量名称中使用某些非字母数字字符时应注意的事项,这些变量保留用于特定功能。如,$字符代表当前Shell的进程ID号或PID-$echo$$上面的命令写入当前Shell的PID-29949下表显示了一些可以在Shell脚本中使用的特殊变量-......
  • 初识Linux(一)
        这是入门Linux的第一周,这一周学习的是有关Linux系统的简介以及centos系统和vmware虚拟机的安装。    在学习Linux的第一章中,我首先对Linux有了更深入的理解和认识。Linux是一种自由和开放源代码的操作系统,它是由芬兰计算机科学家LinusTorvalds于1991年首次开......
  • 无涯教程-Linux - 变量声明
    在本章中,我们将学习如何在Unix中使用Shell变量,变量不过是指向实际数据的指针,Shell使您可以创建,分配和删除变量。变量名变量名称只能包含字母(a到z或A到Z),数字(0到9)或下划线字符(_),按照约定,Unixshell变量将以大写字母命名。以下示例是有效的变量名-_ALITOKEN_AVAR_1VAR_......