如何在Linux/Unix Shell中使用sed查找和替换文件中的文本

时间:2020-01-09 10:39:52  来源:igfitidea点击:

如何找到名为foo的文本,并替换为名为hosts.txt的文件中的bar。
如何使用sed命令在Linux或类似UNIX的系统上查找和替换?

sed代表流编辑器。
它读取给定文件,并根据sed命令列表指定的内容修改输入。
默认情况下,输入被写入屏幕,但是您可以强制更新文件。

使用sed命令查找和替换文件中的文本

在Linux/Unix下使用sed更改文件中文本的过程:

  • 如下使用Stream EDitor(sed):
  • sed -i's/old-text/new-text/g'input.txt`
  • s是sed的替代命令,用于查找和替换
  • 它告诉sed查找所有出现的旧文本,并在名为input.txt的文件中将其替换为新文本。
  • 验证文件已更新:

让我们详细了解语法和用法。

语法:sed查找并替换文本

语法为:

sed 's/word1/word2/g' input.file
## *bsd/macos sed syntax#
sed 's/word1/word2/g' input.file > output.file
sed -i 's/word1/word2/g' input.file
sed -i -e 's/word1/word2/g' -e 's/xx/yy/g' input.file
## use + separator instead of / ##
sed -i 's+regex+new-text+g' file.txt

上面的代码将模式空间中单词1中所有出现的字符替换为单词2中的相应字符。

使用sed查找和替换的示例

让我们创建一个名为hello.txt的文本文件,如下所示:

$ cat hello.txt

我将使用s /用bar代替找到的表达式foo,如下所示:

sed 's/foo/bar/g' hello.txt

输出示例:

The is a test file created by nixCrft for demo purpose.
bar is good.
Foo is nice.
I love FOO.

要更新文件,请通过-i选项:

sed -i 's/foo/bar/g' hello.txt
cat hello.txt

g /表示全局替换,即查找所有出现的foo并使用sed替换为bar。
如果删除了/g,则只会更改第一次出现的情况:

sed -i 's/foo/bar/' hello.txt

/用作分隔符。
要匹配foo的所有情况(foo,FOO,Foo,FoO),请添加I(大写I)选项,如下所示:

sed -i 's/foo/bar/gI' hello.txt
cat hello.txt

输出示例:

The is a test file created by nixCrft for demo purpose.
bar is good.
bar is nice.
I love bar.

请注意sed的BSD实现(FreeBSD/MacOS和co)不支持不区分大小写的匹配。
您需要安装gnu sed。
在Apple Mac OS上运行以下命令:

$ brew install gnu-sed
######################################
### now use gsed command as follows ##
######################################
$ gsed -i 's/foo/bar/gI' hello.txt
$ cat hello.txt

sed命令问题

考虑以下文本文件:

$ cat input.txt

找到单词http://并替换为https://www.theitroad.local:

sed 's/http:///https://www.theitroad.local/g' input.txt

您将收到一条错误消息,内容如下:

sed: 1: "s/http:///https://www.c ...": bad flag in substitute command: '/'

我们的语法是正确的,但是/分隔符也是上述示例中word1和word2的一部分。

sed命令允许您将定界符/更改为其他内容。
所以我将使用+:

sed 's+http://+https://www.theitroad.local+g' input.txt

输出示例:

https://www.theitroad.local is outdate.
Consider using https:// for all your needs.

如何使用sed匹配单词并执行查找和替换

在此示例中,仅当行包含特定字符串(例如FOO)时,才找到love单词并将其替换为病号:

sed -i -e '/FOO/s/love/sick/' input.txt

使用cat命令验证新更改:

cat input.txt

使用sed查找和替换

通用语法为:

## find word1 and replace with word2 using sed ##
sed -i 's/word1/word2/g' input
## you can change the delimiter to keep syntax simple ##
sed -i 's+word1+word2+g' input
sed -i 's_word1_word2_g' input
## you can add I option to GNU sed to case insensitive search ##
sed -i 's/word1/word2/gI' input
sed -i 's_word1_word2_gI' input