如何在不使用命令 Sed 的情况下查找和替换字符串?

如何在不使用命令 Sed 的情况下查找和替换字符串?

众所周知,sed查找和替换字符串的效率非常高,例如查找 'a' 并将其替换为 'b': sed 's/a/b/g'

是否可以使用其他命令或 shell 脚本来代替sed

这是针对没有该命令的电视的裁剪版 Linux 系统sed。所以我必须使用其他命令或脚本来代替sed 's/a/b/g'. –

答案1

单字母替换的经典替代方法是tr该命令几乎可以在任何系统上使用:

$ echo "foobar" | tr a b   
foobbr

trsed实际上比这更好,因为使用sed(更不用说perlawk)进行单字母替换就像使用大锤杀死苍蝇一样。

grep不是为此设计的,它不会修改其输入,它只会搜索它。

或者,您可以使用替代能力一些贝壳。这里使用ksh, zshorbash语法:

$ foo="foobar"
$ echo "${foo//a/b}"
foobbr

如果您准确解释了您要解决的问题,我们可以为您提供更具体的答案。

答案2

是的,有多种方法可以做到这一点。您也可以使用awkperl、 或来执行这些活动。bash一般来说,它sed可能是执行此类任务的最合适的工具。

例子

假设我在一个文件中有这个示例数据data.txt

foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50

awk

$ awk '{gsub("foo", "foofoofoo", $0); print}' data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

珀尔

$ perl -pe "s/foo/foofoofoo/g" data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

内联编辑

上面的例子也可以直接修改文件。 Perl 的例子很简单。只需添加-i开关即可。

$ perl -pie "s/foo/foofoofoo/g" data.txt 

因为awk它不太直接,但同样有效:

$ { rm data.txt && awk '{gsub("foo", "foofoofoo", $0); print}' > data.txt; } < data.txt

此方法创建一个带有大括号 '{ ... }` 的子 shell,其中文件通过以下方式重定向到其中:

$ { ... } < data.txt

一旦文件被重定向到子 shell 中,它就会被删除,然后awk针对读入子 shell STDIN 的文件内容运行。然后,该内容将被处理awk并写回到我们刚刚删除的相同文件名中,从而有效地替换它。

答案3

您可以使用 POSIX 工具ex

ex a.txt <<eof
%s/Sunday/Monday/g
xit
eof

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html

答案4

使用祖先命令(其中-s表示安静(无声),命令前的逗号表示在所有行上执行):

刚刚打印标准输出:

ed -s file <<!
,s/a/b/g
,p
q
!

就地替换:

ed -s file <<!
,s/a/b/g
w
q
!

相关内容