以下是示例数据:
ServerA
Value1 fh824rfz
Plan CustomA
ServerB
Value3 9fgjzxlo
Plan CustomD
ServerC
Value10 339fgh0l
Plan CustomE
字符串
下面是vscode
中的正则表达式:
(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)
型
预期的输出:
ServerA
Value1 fh824rfz
ServerB
Value3 9fgjzxlo
ServerC
Value10 339fgh0l
型
但是我尝试在sed
中使用这样的正则表达式,但它们不起作用:
-E 's|(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)\n|\1|g'
-re 's|(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)\n|\1|g'
-zre 's|(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)\n|\1|g'
型
我该怎么办?我认为问题出在\n
上,因为当我删除它时,示例可以工作(但仍然不是预期的输出)。
8条答案
按热度按时间fxnxkyjh1#
使用GNU awk:
字符串
kuarbcqp2#
使用您显示的示例,请尝试以下
awk
代码。使用awk
的match
函数,其中使用regex来获取匹配值。字符串
smdncfj33#
哇,所有的教授都聚集在这里。我也可以提出一个方法吗?😉
字符串
产出:
型
iugsix8n4#
字符串
p4rjhz4m5#
将
$0
保存在awk
中,然后使用虚拟getline
来“删除下一行”,方法是利用其返回代码作为substr()
的起始索引,并使用赋值来用当前行覆盖“下一行”:iyzzxitl6#
这里有一种方法(使用
GNU sed
检查,语法可能因其他实现而异):字符串
n
命令打印图案空间(如果-n
选项未禁用自动打印),将其替换为下一行,d
将删除它。xmq68pz97#
默认情况下,
sed
是基于行的,你不能像在前两个尝试中那样一次处理多行。例如,要应用你的策略,你必须将下一行连接到当前行(N
命令),然后处理这个由两行组成的块:字符串
另一种解决方案,如果您使用的是GNU
sed
,如果您的文件不是太大,并且不包含NUL
字节(ASCII码0),是使用-z
选项将整个文件作为一行插入换行符(使用-z
选项时,sed
认为输入行由NUL
字节而不是换行符终止):型
这几乎是你在第三次尝试时所尝试的,但是由于你使用的
(.*)
组匹配了包括换行符在内的所有字符,所以你只打印了第一组...在第三次尝试中将(.*)
替换为[^\n]*
应该可以工作。另请注意,当您要抑制它时,不需要进行分组。使用GNU
sed
,您还可以使用s
命令的多行模式(m
修饰符),这样句点就不匹配换行符:型
由于其他人也提出了
awk
解决方案,这里是一个简单的:型
也就是说,如果变量
s
不同于0(或空字符串),则将其重置为0并跳过当前行(next
)。否则,如果当前行与正则表达式匹配,则将变量s
设置为1。最后,打印当前行(1
)。3okqufwl8#
sed通常不是一次处理多个输入行的最佳工具。
使用任何POSIX awk,一次只在内存中存储1行:
字符串