【发布时间】:2022-01-14 13:40:28
【问题描述】:
awk 'tolower($0) ~ /\.[log(message|event)|trace(error)?c?|infoc?|warnc?|debugc?|errorc?]/,/)/{gsub(/^\t+/, "", $0);print NR","$0}' example_file
我创建了这个脚本,它可以在文件中查找以下模式:
log.Info("hello world")
log.Error()
并输出如下内容:
4,log.Info("hello world")
7,log.Error()
行号和文本本身。
问题是,如果我的文件中有这样的内容:
log.Info("hello world")
log.Warn(
"hello world")
log.Error()
它会输出如下内容:
4,log.Info("hello world")
5,log.Warn(
6,"hello world")
7,log.Error()
我想让"hello world") 与log.Warn( 相同。
如果找到的下一行不是以模式/\.[log(message|event)|trace(error)?c?|infoc?|warnc?|debugc?|errorc?]/ 开头的,它会将这一行放在之前的行上。
所需的输出类似于:
4,log.Info("hello world")
5,log.Warn("hello world")
7,log.Error()
非常感谢。
【问题讨论】:
-
请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。
-
@Cyrus 你好。我实际上是这样做的。 “问题是,如果我的文件中有类似的东西”有样本,所需的输出是问题的最后一部分。我没明白你的意思,抱歉。
-
/\.[log(me这是一个非常奇怪的正则表达式,它不是这样工作的。gsub(/^\t+/, "", $0)不,你不能简单地做。问题在于您如何表述条件:if the **next line** found如果您决定对下一行 执行操作,这意味着您必须 缓冲数据。写一些依赖于当前行的东西,没有下一个,比如“如果当前行不以)结尾”。 -
@KamilCuk 我使用 regex101 制作的,像这样:regex101.com/r/YMvp01/1
-
嗯,是的,它是一个有效的正则表达式。不,括号表达式不会选择其中的表达式之一,
|是其中的普通字符。您的正则表达式与[()?abcdefgilmnorstuvw|]相同。[...]不是(..)