我正在使用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 - 哪个最快?
答案 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'