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
倘若省掉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
选择项。在下面的案例中,大家一起应用g
和I
选择项:
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入门教程。如果您有任何问题或意见和建议,请随时。
