好的,所以我有这个文件作为例子,它看起来像文本文件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
命令打印模式空间的第一行,并附加一行换行符。
D
命令删除模式空间的第一行及其换行符。如果模式空间为空,则调用默认行为,并将下一行读取到模式空间中。如果模式空间不是空的,它会将其单独保留,不在下一行中读取,然后开始第一个sed命令。
也许你真正想要的是:
sed 'N;/[0-9]*.[0-9][0-9]n[0-9]*.[0-9][0-9]/!P;D' file
如果一对线条的图案匹配,则不打印第一行。