使用GNU sed匹配多个条件

时间:2016-10-28 15:59:08

标签: bash perl shell awk sed

我正在使用sed替换其他bash脚本中的值,例如:

somedata="$(<somefile.sh)"
somedata=`sed 's/ ==/==/g' <<< $somedata` # [space]== becomes ==
somedata=`sed 's/== /==/g' <<< $somedata` # ==[space] becomes ==

对于||,&amp;&amp;,!=等同样如此。我认为应该通过正确的正则表达式匹配来减少步骤。操作员不需要周围空间,但可以在之前和之后,仅在之前或之后具有空间。有没有办法用一个sed命令处理所有这些?

还有许多其他条件也未提及。该脚本比预期花费更多时间执行。

目标是减少总体执行时间,因此我希望减少巧妙的正则表达式使用的命令数量以匹配多个条件。

我也在考虑tr,awk或perl - 哪个最快?

3 个答案:

答案 0 :(得分:0)

您可以使用-e标记链接多个sed替换:

$ echo -n "test data here" | sed -e 's/test/TEST/' \
                                 -e 's/data/HERE/' \ 
                                 -e 's/here/DATA/'
$ TEST HERE DATA

答案 1 :(得分:0)

您可以使用sedfile-f选项)和-i选项(替换就地,无需存储在env。变量中):

sed -i -f mysedfile somefile.sh

mysedfile可能包含表达式,每行1个

s/ *&& */\&\&/g
s/ *== */==/g

(或者使用-e选项来使用多个表达式,但是如果你有很多表达式,它将很快变得不可读)

BTW:-i选项在处理的文件目录中创建一个临时文件,最后,如果操作成功,则删除原始文件,临时文件为重命名为原始文件名

  

当到达文件末尾时,将重命名临时文件        到输出文件的原始名称。扩展,如果提供,        用于在重命名之前修改旧文件的名称        临时文件,从而制作备份副本(2))

因此该选项没有I / O开销。根本不需要存储在变量中。

答案 2 :(得分:0)

使用GNU sed,您可以使用|(或)运算符:

$ sed -r 's/ *(&&|\|\|) */\1/g' <<< "foo && bar || baz"
foo&&bar||baz
  • *(&&|\|\|) *:搜索零个或多个空格,后跟任意|个分隔的字符串,后跟零个或多个空格
  • 使用反向引用
  • 捕获并输出匹配的字符串

修改

正如评论中所指出的,您可以使用GNU sed的-E标志代替-r。您的命令将更加便携:

sed -E 's/ *(\&\&|\|\|) */\1/g'

由于GNU sed还支持使用Basic Regular Expressions的\|交替运算符,您可以使用它来提高可读性:

sed 's/ *\(&&\|||\) */\1/g'