我将使用啥 GNU/Linux 命令行工具对文件执行搜索和替换?
Posted
技术标签:
【中文标题】我将使用啥 GNU/Linux 命令行工具对文件执行搜索和替换?【英文标题】:What GNU/Linux command-line tool would I use for performing a search and replace on a file?我将使用什么 GNU/Linux 命令行工具对文件执行搜索和替换? 【发布时间】:2010-09-14 10:21:11 【问题描述】:我将使用什么 GNU/Linux 命令行工具对文件执行搜索和替换?
能否以正则表达式格式指定搜索文本和替换?
【问题讨论】:
【参考方案1】: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 在脚本中使用扩展的正则表达式。
FreeBSD、NetBSD 和 OpenBSD 版本也支持这些选项。
如果您想了解更多关于 sed 的信息,Cori 推荐了this tutorial。
【讨论】:
我不知道允许扩展正则表达式的 -r 开关 - 方便!此外,-i 是 --in-place 的快捷方式。 如果您想了解更多信息,请使用上面的 cori 链接。 sed 比 perl afaik 更轻量【参考方案2】: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 的工作。
【讨论】:
【参考方案3】:将 Ruby 视为 Perl 的替代品。它窃取了 Perl 的大部分单行命令行参数(-i
、-p
、-l
、-e
、-n
)并像 Perl 一样为您自动设置了$_
,并且有很多正则表达式的优点。此外,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,性能都不足以成为问题。使用最容易编写的内容。
【讨论】:
感谢您提供的有用示例!我认为可以通过以下方式(稍微)简化:ruby -pi.bak -e 'gsub(/foo|bar/)|x| x.upcase' *.txt
(例如,删除$_
)。【参考方案4】:
sed,流编辑器,是的,它使用正则表达式。
【讨论】:
以上是关于我将使用啥 GNU/Linux 命令行工具对文件执行搜索和替换?的主要内容,如果未能解决你的问题,请参考以下文章