26

我将使用什么 GNU/Linux 命令行工具来对文件执行搜索和替换?

可以以正则表达式格式指定搜索文本和替换吗?

4

4 回答 4

52
sed 's/a.*b/xyz/g;' old_file > new_file

GNU sed(你可能有)更加通用:

sed -r --in-place 's/a(.*)b/x\1y/g;' your_file

以下是这些选项的简要说明:

-i[SUFFIX], --in-place[=SUFFIX] 就地编辑文件(如果提供扩展名,则进行备份)

-r, --regexp-extended 在脚本中使用扩展的正则表达式。

FreeBSDNetBSDOpenBSD版本也支持这些选项。

如果你想了解更多关于 sed 的信息,Cori推荐了这个教程

于 2008-10-01T02:08:34.980 回答
28

Perl 就是为此而发明的:

perl -pi -e 's/foo/bar/g;' *.txt

这些单引号中的任何正常 s/// 模式。您可以使用以下内容进行备份:

perl -pi.bak -e 's/foo/bar/g;' *.txt

或管道:

cat file.txt | perl -ne 's/foo/bar/g;' | less

但这确实是 sed 的工作。

于 2008-10-01T02:04:16.007 回答
6

将 Ruby 视为 Perl 的替代品。它像 Perl 一样为您窃取了大部分 Perl 的单行命令行参数 ( -i, -p, -l, -e, -n) 和自动设置$_,并且有很多正则表达式的优点。此外,Ruby 的语法可能比 Perl 或 sed 的语法更舒适、更易于阅读或编写。(或不,取决于你的口味。)

ruby -pi.bak -e '$_.gsub!(/foo|bar/){|x| x.upcase}' *.txt

对比

perl -pi.bak -e 's/(foo|bar)/\U\1/g' *.txt

在许多情况下,当处理单行代码时,性能并不足以成为关心您使用轻量级 sed 还是重量级 Perl 还是重量级 Ruby 的问题。使用最容易编写的任何内容。

于 2008-10-01T19:41:44.013 回答
5

sed,流编辑器,是的,它使用正则表达式。

于 2008-10-01T02:04:44.333 回答