正则表达式语法有很多变体。Unix世界中最早具有正则表达式的工具并不具有正则表达式的全部功能,只有字符集([…]
和.
),重复(*
)和行锚(^
和$
)。基本正则表达式只有这些运算符。Sed是一种老式工具,使用基本的正则表达式。
许多sed实现都有完整的正则表达式匹配的扩展。由于字符|
代表本身,你需要使用\|
的交替,同样\(
并\)
进行分组。请注意,POSIX标准并不要求基本正则表达式\|
必须支持它,而某些系统(例如OpenBSD)则没有。
某些版本的sed可以选择切换到扩展的正则表达式,(…)
用于分组和|
交替。使用GNU sed(即在Linux或Cygwin下)或Busybox时,传递该-r
选项。在FreeBSD或OSX上,传递-E
选项。
如果您的sed没有交替,您可以致电awk
。它是由POSIX强制执行的,但是对于此任务有点冗长,并且不支持反向引用。
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
顺便说一下,只有GNU和Busybox sed支持替换文件。Awk和其他版本的sed则没有。请参阅我可以使`cut`改变文件位置吗?
如果您有Perl,则通常以一种工具完成所有形式的单行工具就很方便。在sed,awk中最容易实现的大多数事情,在Perl中并不困难,而您可以通过学习单个(如果是复杂的)工具来摆脱困境。
perl -i -pe 's/foo|bar/narf/g' fileName