【问题标题】:Notepad++ find all lines with open parentheses but no close parentheses and add closer parentheses for AWK script errorNotepad++ 查找所有带左括号但没有右括号的行,并为 AWK 脚本错误添加更近的括号
【发布时间】:2018-04-11 18:37:45
【问题描述】:

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

/resource/text_(moretext 

现在这些需要用“)”关闭,但文件太大而无法手动执行此操作。不幸的是,行内的文本可以是任何东西。所以我认为我需要一些能够找到所有具有“(”和没有“)”的行的表达式。然后必须用完全相同的内容替换这些行,但在末尾添加“)”。

所以它应该是这样的:

之前:

/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/

非常感谢您的帮助:)

【问题讨论】:

  • 如果你不表现出你的努力,就会跑题。
  • 我只是对其进行了一些编辑,以包含我的 AWK 脚本和我收到的错误。至于表达式示例;我只设法弄清楚 \r 来查看行尾,但我不知道如何具体查找“(”以及如何忽略行内的文本。
  • 概念似乎相当简单。搜索特定字符后跟任何其他字符并附加另一个字符。
  • 使用 sed(带 -E)或 notepad++:s/(\([^)]+$)/\1)/
  • 在模式部分使用正则表达式:\([^\r\n)]+$ 并替换为$0)

标签: regex awk notepad++ gawk


【解决方案1】:

使用带有 -E 选项的 sed 你可以这样做:

sed -E 's/\([^)]+$/\0)/' file

使用 Notepad++,您可以对这一区别做同样的事情,您应该在字符类中包含换行符,最好使用 \r

【讨论】:

  • 使用您以前的正则表达式 ([^\r\n)]+$ 可以找到这些行,但替换 $0) 似乎不会将 ) 添加到该行。
  • @Knarf 我认为这是记事本++中的不一致。在$0 之后转义)$0\)
  • 啊,就是这样!最后一件小事:显然我所有的行后面都有一个空格,所以现在它添加了 ) ,中间有一个空格。是否也可以删除该空间?例如,现在我得到“/resource/Augustus_(uitgeverij)”,它应该是“/resource/Augustus_(uitgeverij)”。
  • 是的,搜索\([^)\r\n]+?\K\s*$并替换为\)$0
  • 如果您也想删除行尾空格,只需删除 $0
【解决方案2】:

我相信这应该可以帮助您完成大部分工作。

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

替换:$1\)\n

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

\ 转义一个字符,因此\( 将在文本中选择一个左括号,而不是在表达式中标记捕获。

方括号标记一组字符以匹配^ 字符标记,您希望匹配组中不存在的任何内容。所以[^\(] 匹配任何不是左括号的东西。该组后面是一个*,它量化了 0 个或多个匹配项。

最后\n 标记了一个新行。根据格式,这可能不是您的行尾的正确字符。您可能需要改用 \r\n 之类的东西。

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2016-08-26
    • 1970-01-01
    • 2016-05-21
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多