使用sed时如何在下一行继续模式?

时间:2015-08-23 13:22:03

标签: regex bash sed

在使用&sed'时,我需要一些帮助来继续下一行中的模式。它抛出它无法读取所有模式的文件(第一个除外)

cat server.xml | sed -E 's|(jndiName=")[^/]*(/jdbc/WorklightDS")|\1clsapp\2|' \
                        's|(worklightlib_)[^/]*(")|\1clsapp\2|' \
                        's|(libraryRef=")[^/]*(/)|\1clsapp\2|' \
                        's|(jndiName=")[^/]*(/jdbc/WorklightReportDS)|\1clsapp\2|' \
                        's|(resource.dir}/)worklightconsole(/lib")|\1clsapp\2|g'

我读到了' \'反斜杠将帮助我们继续下一行的模式。

但是,不幸的是它没有按预期工作,我在RHEL 6.5上工作并且很想知道解决方案

注意:我可以通过遵循不同的机制来替换该值。

我的意见是:

<dataSource jndiName="worklightconsole/jdbc/WorklightReportsDS" transactional="false"> OUTPUT ----> <dataSource jndiName="clsapp/jdbc/WorklightReportsDS" transactional="false">

1 个答案:

答案 0 :(得分:3)

最好在构建复合体之前先进行小而简单的操作,当复杂的操作失败时,最好退回到简单的操作。

在这种情况下,如果我们退缩到这一点:

echo apple | sed -E 's|a|A|' \
                    's|e|E|'

我们发现问题仍然存在,如果我们进一步退缩:

echo apple | sed -E 's|a|A|' 's|e|E|'

我们发现问题与使用反斜杠继续模式到下一行无关。问题是你不能像这样将命令串起来。我建议这个:

echo apple | sed -E -e 's|a|A|' -e 's|e|E|'

这是有效的,所以这样做:

echo apple | sed -E -e 's|a|A|' \
                    -e 's|e|E|'

现在您可以重新构建复杂的案例。