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(更不用说perl或awk)进行单字母替换就像使用大锤杀死苍蝇一样。
grep 不是为此而设计的,它不会修改其输入,它只会搜索它。
或者,您可以使用某些 shell的替换功能。这里使用ksh,zsh或bash语法:
$ foo="foobar"
$ echo "${foo//a/b}"
foobbr
Run Code Online (Sandbox Code Playgroud)
如果您准确解释了您要解决的问题,我们可以为您提供更具体的答案。
slm*_*slm 13
是的,有多种方法可以做到这一点。您也可以使用awk、perl、 或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我们刚刚删除的相同文件名处理并写回,从而有效地替换它。