当前位置: 首页 > Linux

Linux常用命令09——sed

时间:2023-04-06 18:48:14 Linux

在处理文本文件时,通常需要在一个或多个文件中查找和替换文本字符串。sed是一个流编辑器。它可以对文件和输入流(如管道)执行基本的文本操作。使用sed,您可以搜索、查找和替换、插入和删除单词和行。它支持基本和扩展的正则表达式,允许您匹配复杂的模式。接下来,我将使用sed查找和替换字符串。我还将向您展示如何执行递归搜索和替换。有多个版本的sedsed可以查找和替换字符串,它们之间存在一些功能差异。Macos使用BSD版本,大多数Linux发行版默认预装GNU。以下默认为GNU版本。用sed搜索和替换文本的一般形式如下:sed-i's/SEARCH_REGEX/REPLACEMENT/g'INPUTFILE-i将其输出写入标准输出seds替代命令,可能是sed中最常用的命令-/分隔符.它可以是任何字符,但通常是一个斜杠(/)字符SEARCH_REGEX普通字符串或正则表达式来搜索REPLACEMENT替换字符串g全局替换标志。默认情况下,文件是逐行读取的,只有第一次出现的SEARCH_REGEX被更改,当提供替换标志时,所有出现的地方都被替换为INPUTFILE运行命令的文件名最好用引号括起来,这样shell元字符就不会展开。让我看一些示例,了解如何使用sed命令使用一些最常用的选项和标志来搜索和替换文件中的文本。出于演示目的,我将使用以下文件file.txt:123Foofoofoofoo/bin/bashUbuntufoobar456如果省略g标志,则每行中搜索字符串的第一个实例将被替换:sed-i'''s/foo/linux/'file.txt123Foolinuxfoolinux/bin/bashUbuntufoobar456使用全局替换标志sed替换所有出现的搜索模式:sed-i'''s/foo/linux/g'file.txt123Foolinuxlinuxlinux/bin/bashUbuntulinuxbar456您可能已经注意到,在前面的示例中,foobar字符串中的子字符串foo也被替换了。如果这不是所需的行为,请在搜索字符串的两端使用单词边界表达式(b)。这将确保部分单词不匹配。sed-i's/\bfoo\b/linux/g'file.txt123Foolinuxlinuxlinux/bin/bashUbuntufoobar456要使模式匹配不区分大小写,请使用I标志。在下面的示例中,我同时使用了g和I标志:sed-i's/foo/linux/gI'file.txt123linuxlinuxlinuxlinux/bin/bashUbuntulinuxbar456如果你想查找并替换包含分隔符(/),则需要使用反斜杠(\)对斜杠进行转义。例如,将/bin/bash替换为/usr/bin/zshsed-i'''s/\/bin\/bash/\/usr\/bin\/zsh/g'file.txt以获得更简单和更易读的选项是使用另一个分隔符。大多数人使用竖线(|)或冒号(:),但您可以使用任何其他字符:sed-i's|/bin/bash|/usr/bin/zsh|g'file.txt123Foofoofoofoo/usr/bin/zshUbuntufoobar456也可以使用正则表达式。例如,要搜索所有3位数字并将它们替换为您将使用的字符串数字:sed-i's/\b[0-9]\{3\}\b/number/g'file.txtnumberAnotherFoofoofoofoo/bin/bashdemofoobarnumbered的有用特性是您可以使用与匹配模式相对应的符号。该字符可以多次使用。例如,如果您想要用大括号{}将每个3位数字括起来,请键入:sed-i's/\b[0-9]\{3\}\b/{&}/g'file。txt{123}Foofoofoofoo/bin/bashdemofoobar{456}最后但同样重要的是,在使用sed编辑文件时进行备份始终是个好主意。为此,只需提供-i选项的扩展。例如,要编辑file.txt并将原始文件另存为file.txt.bak,请使用:sed-i.bak's/foo/linux/g'file.txt如果要确保已创建备份,使用ls命令列出文件:lsfile.txtfile.txt.bak递归查找和替换有时您想要递归地搜索目录以查找包含字符串的文件并替换所有文件中的字符串。这可以通过使用find或grep之类的命令递归地在目录中查找文件并将文件名通过管道传输到sed来实现。下面的命令将递归搜索当前工作目录文件夹中的文件并将文件名传递给sed。寻找。-typef-execsed-i's/foo/bar/g'{}+为避免文件名中出现空格问题,您可以使用-print0选项,它告诉find打印文件名后跟一个空字符,并且使用xargs-0将输出通过管道传递给sed:find。-类型f-print0|xargs-0sed-i's/foo/bar/g'要排除目录,请使用非路径选项。例如,如果您要替换本地git存储库中的字符串以排除所有以点(.)开头的文件,请使用:find。-typef-not-path'*/\.*'-print0|xargs-0sed-i's/foo/bar/g'如果您只想搜索和替换具有特定扩展名的文件中的文本,您可以使用:find。-typef-name"*.md"-print0|xargs-0sed-i's/foo/bar/g'另一种选择是使用grep命令递归查找包含搜索模式的所有文件,然后将文件名通过管道传递给sed:grep-rlZ'foo'。|xargs-0sed-i.bak's/foo/bar/g'总结虽然看起来复杂复杂,但实际上用sed查找和替换文件中的文本非常简单。本文由多发平台ArtiPub自动发布