Notepad++ 查找所有带左括号但没有右括号的行,并为 AWK 脚本错误添加更近的括号
Notepad++ find all lines with open parentheses but no close parentheses and add closer parentheses for AWK script error
我有几个大型日志文件,其中包含以下格式的行:
/resource/text_(moretext
现在这些需要用“)”关闭,但文件太大无法手动执行此操作。不幸的是,行内的文本可以是任何东西。所以我想我需要一些能够找到所有有“(”但没有“)”的行的表达式。然后必须将这些行替换为完全相同的内容,但在末尾添加“)”。
所以它应该是这样的:
之前:
/resource/text_(moretext
之后:
/resource/text_(moretext)
我觉得这在 Notepad++ 中使用正则表达式应该是可能的,但我很难弄清楚如何做到这一点。
我需要这个,因为我正在将这些日志与 .TTL 文件进行比较,以提取可以在两个文件中找到的行。我使用以下 AWK 脚本执行此操作:
BEGIN { IGNORECASE = 1 } # ignoring the case
NR==FNR { a[]; next } # hash csv to a hash
{
for(i in a) { # each entry in a
if([=13=] ~ 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/
非常感谢您的帮助:)
我相信这应该可以帮助您完成大部分工作。
查找:([^\(]*\([^\(]*)\n
替换:\)\n
在您的查找中,未转义的括号标记了一个要捕获的组(您要保留的文本),该组被替换为 </code></p>
<p><code>\
对字符进行转义,因此 \(
将在文本中选择左括号而不是在表达式中标记捕获。
方括号标记要匹配的字符集,^
字符标记您要匹配组中不存在的任何内容。所以 [^\(]
匹配任何不是左括号的东西。该组后跟一个 *
,它量化 0 个或多个匹配项。
最后 \n
标记了一个新行。根据格式,这可能不是您行尾的正确字符。您可能需要使用 \r\n
之类的东西。
我发现构建正则表达式查询的有用资源是 https://regexr.com
您可以粘贴您的文本示例并尝试一些匹配。
希望这对您有所帮助。
将 sed 与 -E 选项结合使用,您可以:
sed -E 's/\([^)]+$/[=10=])/' file
使用 Notepad++,你可以对这种差异做同样的事情,你应该在字符 class.
中包含换行符,最好使用 \r
我有几个大型日志文件,其中包含以下格式的行:
/resource/text_(moretext
现在这些需要用“)”关闭,但文件太大无法手动执行此操作。不幸的是,行内的文本可以是任何东西。所以我想我需要一些能够找到所有有“(”但没有“)”的行的表达式。然后必须将这些行替换为完全相同的内容,但在末尾添加“)”。
所以它应该是这样的:
之前:
/resource/text_(moretext
之后:
/resource/text_(moretext)
我觉得这在 Notepad++ 中使用正则表达式应该是可能的,但我很难弄清楚如何做到这一点。
我需要这个,因为我正在将这些日志与 .TTL 文件进行比较,以提取可以在两个文件中找到的行。我使用以下 AWK 脚本执行此操作:
BEGIN { IGNORECASE = 1 } # ignoring the case
NR==FNR { a[]; next } # hash csv to a hash
{
for(i in a) { # each entry in a
if([=13=] ~ 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/
非常感谢您的帮助:)
我相信这应该可以帮助您完成大部分工作。
查找:([^\(]*\([^\(]*)\n
替换:\)\n
在您的查找中,未转义的括号标记了一个要捕获的组(您要保留的文本),该组被替换为 </code></p>
<p><code>\
对字符进行转义,因此 \(
将在文本中选择左括号而不是在表达式中标记捕获。
方括号标记要匹配的字符集,^
字符标记您要匹配组中不存在的任何内容。所以 [^\(]
匹配任何不是左括号的东西。该组后跟一个 *
,它量化 0 个或多个匹配项。
最后 \n
标记了一个新行。根据格式,这可能不是您行尾的正确字符。您可能需要使用 \r\n
之类的东西。
我发现构建正则表达式查询的有用资源是 https://regexr.com 您可以粘贴您的文本示例并尝试一些匹配。
希望这对您有所帮助。
将 sed 与 -E 选项结合使用,您可以:
sed -E 's/\([^)]+$/[=10=])/' file
使用 Notepad++,你可以对这种差异做同样的事情,你应该在字符 class.
中包含换行符,最好使用\r