如何使用sed查找和替换文件中的字符串(sed匹配替换文件的字符串)

linux 如何使用sed查找和替换文件中的字符串 在处理文本文件时,经常需要在一个或多个文件中查找并替换文本字符串。sed是一个轻量级stream流编辑器。它可以对文件和输入流(例如管道)执行基本的文本操作 By myfreax 14 Jan 2022

sed是一个轻巧stream流在线编辑。它可以对文件或输入流(例如管道推行最基本文本操作过程。您可以使用它搜索,搜索和替换,插到和删除字符串和行。它可用实际上拓展的正则匹配,使大家能够匹配繁琐的方法。

在教学中,我们在这里讨论如何使用sed搜索和替换字符串。我们还将为大家呈现怎么执行递归算法搜索和替换。这其中包括sed简单的字符串搜索与字符串替换,在sed中使用正则表达式,运用find,grep,sed3个指令对文件名称与好多个文件进行递归算法搜索与替换。

sed搜索并替换字符串

有好多版本sed,二者之间在功能上各不相同。macOS运用BSD版本,因为大部分Linux发行版均默认内置GNU sed。我们在这里运用GNU版本。

运用sed搜索和替换汉字的一般形式采用sed以下句法:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
  • -i-此选择项告之sed马上编辑文件。默认情况下,sed将它导出来加载到标准输出。倘若增添了文件后缀名(例如-i.bak,将建立原始文件的备份资料。
  • s-是替换指令,可能是sed中命令。
  • /-分隔符。它会是任意字符,但一般运用斜杠(/作为分隔符。
  • SEARCH_REGEX -要搜索的一般字符串或正则匹配。
  • REPLACEMENT-运用此字符串进行替换。
  • g-全面性替换标识。默认情况下,sed一行行读取文件,并且仅变动文本文档行中第一次出现的SEARCH_REGEX。给与s替换标识后,所有匹配都将被替换。
  • INPUTFILE -要推行替换,删除,撰写等情形文档的名称。

最后做法就是表达式附近加上灶具,便于Shell元字符不易转义。让我们看一下如何使用sed指令搜索和替换word里一些常见选择项和的案例。

源自演说目的,我们在这里运用以下文本文档:

123 Foo foo foo
foo /bin/bash Ubuntu foobar 456
file.txt

倘若省掉g标识,则仅替换每行中第一次搜索完的字符串:

sed -i 's/foo/linux/' file.txt
123 Foo linux foo
linux /bin/bash Ubuntu foobar 456

运用全面性替换标识sed替换所有与搜索搜索算法的字符串:

sed -i 's/foo/linux/g' file.txt
123 Foo linux linux
linux /bin/bash Ubuntu linuxbar 456

您可能早就留意到,在此前的案例中,字符串foo里的子foobar字符串也被替换了。那么这不是想要的行为,请在搜索字符串的两侧运用英文单词界线表达式b。那般可以确保一部分英文单词不一致。

sed -i 's/bfoob/linux/g' file.txt
123 Foo linux linux
linux /bin/bash Ubuntu foobar 456

想让搜索算法不区分大小写,挑选I选择项。在下面的案例中,大家一起应用gI选择项:

sed -i 's/foo/linux/gI' file.txt
123 linux linux linux
linux /bin/bash Ubuntu linuxbar 456

如果要搜索并替换包含分隔符(/的字符串,则需要使用反斜杠(来转义斜杠。例如替换/bin/bash/usr/bin/zsh,我们将运用以下指令:

sed -i 's//bin/bash//usr/bin/zsh/g' file.txt

比较方便最易读这个功能采用的是另一个分隔符。大多数人运用竖道(|或炉灶(:,但您可以使用其他任意字符:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo
foo /usr/bin/zsh Ubuntu foobar 456

您也可以使用正则表达式。例如,搜索所有3位数据信息并将其替换为number,我们将运用指令如下所示:

sed -i 's/b[0-9]{3}b/number/g' file.txt
number Foo foo foo
foo /bin/bash demo foobar number

sed的另一个非常有帮助的作用是您可以使用&熟记相符的值,接着后面引进它。你可以将&多次使用。例如,如果要在每一个3位数据信息附近再加上花括号{},输入您:

sed -i 's/b[0-9]{3}b/{&}/g' file.txt
{123} Foo foo foo
foo /bin/bash demo foobar {456}

最后但是并不是最重要的一点是,运用sed撰写文件时进行备份资料是一个良好习惯。因而,需要提供-i选择项和备份资料位文件后缀名就能。例如,要撰写file.txt和贮存原始文件为file.txt.bak挑选以下方法:

sed -i.bak 's/foo/linux/g' file.txt

如果要确保已建立备份资料,挑选以下ls指令例举文本文档:

ls
file.txt file.txt.bak

递归算法搜索和替换

有时您希望在目录中递归算法地搜索包含特殊字符串文档,并且用特定字符串替换所有文件夹。可以通过运用比如find指令进行递归算法,在目录中搜索然后把文件名管道到sed来完成。

以下指令将递归算法搜索各项任务文件名称中的文本文档,然后把文件名传递给sed

find . -type f -exec sed -i 's/foo/bar/g' {}  

为避免文件名主要包含空格符难题,挑选-print0选择项,该选择项告之find打印文件名,脚后跟一个空字符,然后将导出来通过管道传递给xargs -0

find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

要消除文件名称,挑选-not -path选择项。例如,如果要替换本地git仓库中以点(.开始文本文档,挑选:

find . -type f -not -path '*/.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

如果想想搜索和替换具有独特文件后缀名文档中的文本,则能用:

find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

另一种选择采用的是grep指令以递归算法方式搜索包含搜索方法的所有文件夹,然后将文件名通过管道传递给sed

grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'

结论

虽然看上去较为复杂,但一开始,运用sed来搜索和替换文档里的句子非常简单。要记住有关sed指令,选择项和标志的更多信息,请访问GNU sed手册和Grymoire sed入门教程。如果您有任何问题或意见和建议,请随时。

LINUX

如何在Bash中递增和递减变量-计数器

2023-1-19 12:35:13

LINUX

如何在Debian 10安装PostgreSQL(debian11安装docker)

2023-1-19 12:40:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索