好的所以我有这个文件的例子它看起来像文本文件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不是那么令人困惑,我只是不知道怎么做我头脑中的事情。
答案 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
如果一对线条的图案匹配,则不会打印第一行。