如何在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