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

bin*_*nzq 24 shell text-processing

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

是否可以使用其他命令或 shell 脚本而不是sed?

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

ter*_*don 15

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

$ echo "foobar" | tr a b   
foobbr
Run Code Online (Sandbox Code Playgroud)

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

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

或者,您可以使用某些 shell的替换功能。这里使用ksh,zshbash语法:

$ foo="foobar"
$ echo "${foo//a/b}"
foobbr
Run Code Online (Sandbox Code Playgroud)

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


slm*_*slm 13

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

例子

假设我有这个样本数据,在一个文件中data.txt

foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

珀尔

$ perl -pe "s/foo/foofoofoo/g" data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50
Run Code Online (Sandbox Code Playgroud)

内联编辑

上面的例子也可以直接修改文件。Perl 示例是微不足道的。只需添加-i开关。

$ perl -pie "s/foo/foofoofoo/g" data.txt 
Run Code Online (Sandbox Code Playgroud)

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

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

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

$ { ... } < data.txt
Run Code Online (Sandbox Code Playgroud)

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