在 Sed 中匹配多行并删除其中一个匹配行(正则表达式在文件中出现多次)

Match Multiple Lines in Sed and Delete One of Those Matched Lines (RegExp Happens Multiple Times in File)

好的,所以我有这个文件作为示例,它看起来像这样作为文本文件 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] 中的任何数字,顺序必须保持不变,文件实际上更大,而且有很多我正在运行打开它的文件,根本问题是它做了一次这个替换然后离开了文件,我需要它运行所有实例

编辑2: 我已经看到我的错误在 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 并没有那么令人困惑,我只是不知道该怎么做。

这可能适合您 (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 命令打印模式的第一行 space 并附加一个换行符。

D 命令删除模式 space 的第一行及其换行符。如果模式 space 为空,则调用默认行为并将下一行读入模式 space。如果模式 space 不为空,它就不管它,不读入下一行,然后开始第一个 sed 命令。

也许你真正想要的是:

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

如果一对行的模式匹配,则不打印第一行。