sed - 如何进行多次连续替换但仅处理文件一次?

sed - 如何进行多次连续替换但仅处理文件一次?

如果我要做多次需要连续的替换,例如

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/' t1_spec.rb
sed -i '/expect(browser.*\.should/s/\.should/).should/' t1_spec.rb
sed -i 's/\.should/\.to/' t1_spec.rb 
sed -i 's/==/eq/' t1_spec.rb 

有没有更好的方法来做到这一点,只遍历 t1_spec.file 一次,并对每行进行 4 次替换,而不是遍历文件 4 次?

答案1

除了使用分号之外,您还可以使用标志为 sed 提供多个表达式-e

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 

答案2

您可以使用分号来分隔单引号之间的不同替换

sed -i 's/foo/bar/;s/abc/def/' t1_spec.rb

或者您可以将所有这些命令放入一个文件中,并-f使用sed.

sed -i -f my_sed_commands t1_spec.rb

如果您要sed反复使用同一组命令,则使用该文件特别有用。我曾经不得不处理脏数据提要,随着时间的推移,我最终得到了一个 88 行文件,该文件被调用massage.sed来自动清除我从提要中得到的大多数常见错误。

答案3

在 GNU 中(例如在我的 Ubuntu 机器上),支持简单地使用多行,并且推断这意味着多个替换。它运行良好并且看起来不错(恕我直言),因为它避免了超长的线路,例如

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/
        /expect(browser.*\.should/s/\.should/).should/
        s/\.should/\.to/
        s/==/eq/' t1_spec.rb 

相关内容