众所周知,sed
查找和替换字符串的效率非常高,例如查找 'a' 并将其替换为 'b': sed 's/a/b/g'
。
是否可以使用其他命令或 shell 脚本来代替sed
?
这是针对没有该命令的电视的裁剪版 Linux 系统sed
。所以我必须使用其他命令或脚本来代替sed 's/a/b/g'. –
答案1
答案2
是的,有多种方法可以做到这一点。您也可以使用awk
、perl
、 或来执行这些活动。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
!