Notepad ++查找所有带有括号但没有紧密括号的行,并为AWK脚本错误添加更接近的括号

时间:2018-04-10 12:12:10

标签: regex awk notepad++ gawk

我有几个大型日志文件,其中包含以下格式的行:

/resource/text_(moretext 

现在需要用")"来关闭这些文件,但文件太大而无法手动完成。不幸的是,行内的文字可以是任何内容。所以我想我需要一些表达式能够找到所有具有"("和no")"的行。然后这些行必须用完全相同的内容替换,但用")"添加到最后。

所以看起来应该是这样的:

之前:

/resource/text_(moretext 

后:

/resource/text_(moretext) 

我觉得这应该可以在Notepad ++中使用正则表达式,但我很难弄清楚如何做到这一点。

我需要这个,因为我将这些日志与.TTL文件进行比较,以提取可在两个文件中找到的行。我使用以下AWK脚本执行此操作:

BEGIN { IGNORECASE = 1 }  # ignoring the case
       NR==FNR { a[$1]; next }   # hash csv to a hash
       {
           for(i in a) {          # each entry in a
               if($0 ~ i) {      # check against every record of ttl
                   print >> "testrunawk1.txt"        # if match, output matched ttl record
                   next          # skip to next ttl record
               }
            }
       }

现在,当我运行AWK脚本时,我在所有这些行上都出现以下错误:

Fatal: unmatched ( or \(: //resource/text_(moretext/

非常感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

我相信这应该可以帮到你。

查找:([^\(]*\([^\(]*)\n

替换:$1\)\n

在您的查找中,未转义的括号标记要捕获的组(您要保留的文本),该组被$1

置于替换中

\转义某个字符,以便\(在文本中选取一个左括号,而不是在表达式中标记捕获。

方括号标记一组字符以匹配您要匹配组中不存在的任何内容的^字符标记。所以[^\(]匹配任何不是开头括号的东西。该组之后是*,其量化0或更多匹配。

最后,\n标记了一个新行。根据格式,这可能不是您的行结尾的正确字符。您可能需要使用类似\r\n的内容。

我发现构建正则表达式查询的有用资源是https://regexr.com 您可以粘贴文本样本并尝试一些匹配。

希望这有帮助。

答案 1 :(得分:1)

使用带-E选项的sed可以:

char

使用Notepad ++,你可以做同样的事情,你应该在字符类中包含换行符,最好是sed -E 's/\([^)]+$/\0)/' file