匹配Sed中的多行并删除其中一条匹配行(RegExp在文件中多次出现)

时间:2015-04-21 02:59:27

标签: regex bash sed

好的所以我有这个文件的例子它看起来像文本文件test.test输入到sed

Input:
3.00
123.00
sdfasdfs
123.12
3.00
asdfasdf
3.00,123.00
asdfasdf

我想得到这种输出

Desired Output:
123.00
sdfasdfs
3.00
asdfasdf
3.00,123.00
asdfasdf

我一直在尝试这个没有成功

cat test.test | 
sed 'N;/[0-9]*\.[0-9][0-9]\n[0-9]*\.[0-9][0-9]/s/[0-9]*\.[0-9][0-9]\n//g'

它失败了,因为sed只进行了一次替换......它给了我这个输出而不是预期的输出

Erroneous Output From the Above Command:
123.00
sdfasdfs
123.12
3.00
asdfasdf
3.00,123.00
asdfasdf
有人请帮助我了解我在sed中出错的地方

编辑:

这一点是找到具有[0-9] * \。[0-9] [0-9]形式的双线并删除第一个...它在标题中说出来我需要匹配[0-9] * \。[0-9] [0-9]形式的两行,并删除匹配表达式中的第一行,只留下一个[0-9] * \。[0- 9] [0-9]表达式,我已经尝试了上面提到的sed命令,它只影响一个匹配而不是文件中的所有匹配。那些数字只是代表性的,可以是模式[0-9] * \。[0-9] [0-9]中的任何数据,顺序必须保持不变,文件实际上相当大而且有很多我正在运行此文件,根问题是它执行一次替换然后离开文件,我需要它为所有实例运行它

EDIT2: 我已经看到我的错误在sed命令中的位置...它是每隔一行启动模式,这就是为什么它跳过第二个匹配并匹配第一个 看来这是纠正这种情况的可能行动方案

sed -e :a -e '$!N;N;/[0-9]*\.[0-9][0-9]\n[0-9]*\.[0-9][0-9]/s/[0-9]*\.[0-9][0-9]\n//; ta'

但我觉得这不会对所有文件中的所有事件都起作用

有没有办法将标记不附加到表达式的开头,而是附加到替换的末尾? sed不是那么令人困惑,我只是不知道怎么做我头脑中的事情。

1 个答案:

答案 0 :(得分:0)

这可能适合你(GNU sed):

sed 'N;/[0-9]*\.[0-9][0-9]\n[0-9]*\.[0-9][0-9]/s/[0-9]*\.[0-9][0-9]\n//;P;D' file

考虑到每对线,这将在文件中前进。

P命令打印模式空间的第一行并附加换行符。

D命令删除模式空间的第一行及其换行符。如果模式空间为空,则调用默认行为,并将下一行读入模式空间。如果模式空间不为空,则单独保留并且不在下一行中读取,然后开始第一个sed命令。

也许你真正想要的是这个:

sed 'N;/[0-9]*\.[0-9][0-9]\n[0-9]*\.[0-9][0-9]/!P;D' file

如果一对线条的图案匹配,则不会打印第一行。