我有几个大型日志文件,其中包含以下格式的行:
/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/
非常感谢您的帮助:)
答案 0 :(得分:1)
我相信这应该可以帮到你。
查找:([^\(]*\([^\(]*)\n
替换:$1\)\n
在您的查找中,未转义的括号标记要捕获的组(您要保留的文本),该组被$1
\
转义某个字符,以便\(
在文本中选取一个左括号,而不是在表达式中标记捕获。
方括号标记一组字符以匹配您要匹配组中不存在的任何内容的^
字符标记。所以[^\(]
匹配任何不是开头括号的东西。该组之后是*
,其量化0或更多匹配。
最后,\n
标记了一个新行。根据格式,这可能不是您的行结尾的正确字符。您可能需要使用类似\r\n
的内容。
我发现构建正则表达式查询的有用资源是https://regexr.com 您可以粘贴文本样本并尝试一些匹配。
希望这有帮助。
答案 1 :(得分:1)
使用带-E选项的sed可以:
char
使用Notepad ++,你可以做同样的事情,你应该在字符类中包含换行符,最好是sed -E 's/\([^)]+$/\0)/' file
。