我将使用哪种GNU / Linux命令行工具来执行文件的搜索和替换?

时间:2020-03-06 14:57:29  来源:igfitidea点击:

我将使用哪种GNU / Linux命令行工具来执行文件的搜索和替换?

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

解决方案

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的工作。

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

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

GNU sed(我们可能已经拥有了)更加通用:

sed -r --in-place 's/a(.*)b/xy/g;' your_file

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

-i[SUFFIX], --in-place[=SUFFIX]
                  edit files in place (makes backup if extension supplied)
  
  -r, --regexp-extended
                  use extended regular expressions in the script.

FreeBSD版本也支持这些选项。 NetBSD和OpenBSD版本仅支持-r

如果我们想了解有关sed的更多信息,Cori建议使用本教程。

考虑将Ruby替代Perl。它像Perl一样偷了Perl的大多数单行命令行args(-i,-p,-l,-e,-n),并自动为我们设置了$ _。有很多正则表达式的优点。另外,与Perl或者sed相比,Ruby的语法可能更舒适并且更易于读取或者编写。 (或者不,取决于口味。)

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的问题。使用最容易编写的内容。