Cygwin Sed - 一个表达式,用于在开头匹配字符串,在结束时不匹配

时间:2014-04-04 15:55:32

标签: regex linux bash sed cygwin

我一直试图找到一个与cygwin的sed兼容的sed脚本,它将匹配

^<Transaction>且没有</Transaction>$

我需要一个表达式。当行匹配时,我需要删除行结尾或将下一行附加到当前行的末尾。

问题是我们有xml被转储,当行是两长时,它将它分成2行。

3 个答案:

答案 0 :(得分:0)

使用sed:

sed '/^<Transaction>/{/<\/Transaction>$/!{N;s/\n/ /}}'

其工作原理如下。对于以<Transaction>开头但</Transaction>结尾的行,请附加下一行,并用空格替换换行符。所有其他行保持不变。

如果添加的空间不受欢迎,只需将/ /更改为//即可。如果原始文件的任何行已在中拆分,请运行该命令两次。

答案 1 :(得分:0)

Perl救援:

perl -pe 'chomp if /^<Transaction>/ and not /<\/Transaction>$/' file

答案 2 :(得分:0)

sed ':0 /<\/Transaction>$/!N;s/\(^<Transaction>.*\)\n/\1/;t0'

搜索不以</Transaction>结尾的行,添加下一行(\n仍在那里),检查此合并行是否以<Transaction>开头,如果是 - 删除\n\1是对由\(\)中的模式组成的第一个组的反向引用,否则什么也不做;如果\n被删除,请重复。

适用于测试XML文件:

<NotATransaction>a</NotATransaction>
<NotATransaction>b1
b2</NotATransaction>
<Transaction>A</Transaction>
<Transaction>B1
B2
B3
B4
B5</Transaction>
<Transaction>C1
C2</Transaction>
<Transaction>D</Transaction>