【问题标题】:Help with grep in BBEdit帮助 BBEdit 中的 grep
【发布时间】:2011-05-13 01:35:47
【问题描述】:

我想在 BBedit 中 grep 以下内容。

查找:

<dc:subject>Knowledge, Mashups, Politics, Reviews, Ratings, Ranking, Statistics</dc:subject>

替换为:

<dc:subject>Knowledge</dc:subject>
<dc:subject>Mashups</dc:subject>
<dc:subject>Politics</dc:subject>
<dc:subject>Reviews</dc:subject>
<dc:subject>Ratings</dc:subject>
<dc:subject>Ranking</dc:subject>
<dc:subject>Statistics</dc:subject>

查找:

<dc:subject>Social web, Email, Twitter</dc:subject>

替换为:

<dc:subject>Social web</dc:subject>
<dc:subject>Email</dc:subject>
<dc:subject>Twitter</dc:subject>

基本上,当有多个类别时,我需要找到逗号和空格,添加换行符并将打开/关闭包裹在类别周围。

有什么想法吗?

【问题讨论】:

    标签: grep bbedit


    【解决方案1】:

    哇。这里有很多复杂的答案。怎么找:

    , 
    

    (逗号后面有个空格)

    并替换为:

    </dc:subject>\r<dc:subject>
    

    【讨论】:

      【解决方案2】:

      查找:

      (.+?),\s?
      

      替换:

      \1\r
      

      我不确定您所说的“围绕类别包装打开/关闭”是什么意思,但如果您想将其包装在某种标签或链接中,只需将其添加到替换中即可。

      替换:

      <a href="http://example.com/">\1</a>\r
      

      会给你

      <a href="http://example.com/">Social web</a>
      <a href="http://example.com/">Email</a>
      <a href="http://example.com/">Twitter</a>
      

      或者使用 Replace 来获得更好的体验:

      <a href="http://example.com/tag/\1/">\1</a>\r
      

      会给你

      <a href="http://example.com/tag/Social web/">Social web</a>
      <a href="http://example.com/tag/Email/">Email</a>
      <a href="http://example.com/tag/Twitter/">Twitter</a>
      

      在最后一个示例中,您可能会遇到“社交网络”网址中有空格的问题。我不建议这样做,但我想向您展示您可以多次使用 \1 反向引用。

      BBEdit 手册中的 Grep 参考非常棒。转到帮助->用户手册,然后转到第 8 章。学习如何使用 RegEx 将改变您的生活。

      更新 奇怪,当我第一次看到这个时,它并没有向我展示你的完整示例。根据我现在看到的,你应该

      查找:

      (.+?),\s?
      

      替换:

      <dc:subject>\1</dc:subject>\r
      

      【讨论】:

      • 谢谢你,crazyj!在单行上效果很好,但我正在尝试清理 RSS 文件,因此这些行是长文档的一部分,我也需要找到它们。我似乎无法在以下位置启动查找:(.+?),\s? 将其替换为:\1\ r 你知道我会怎么做吗?
      • 您需要像这样&lt;dc:subject&gt;(.+?),\s?&lt;\/dc:subject&gt; 转义结束标记中的反斜杠
      【解决方案3】:

      我不使用 BBEdit,但在 Vim 中你可以这样做:

      %s/(_[^/\=substitute(submatch(0), ",[ \t]*", "\r", "g")/g

      它将处理多行和跨越带有换行符的内容的标签。它也可以处理多行,但不会总是在关闭标记和开始标记之间获得换行符。

      如果您将其发布到 google 组 vim_use 并要求提供 Vim 解决方案及其相应的 perl 版本,您可能会得到一堆建议和一些在 BBEdit 中有效的东西,然后在 perl 中的任何编辑器之外。

      不要

      【讨论】:

      • 感谢您的帮助,唐。我不熟悉 Vim,但会研究它。我的桌面上有一个巨大的 XML 文件,我正在尝试转换上面的文件,以便将其导入新数据库。
      【解决方案4】:

      您也可以使用 sed 来执行此操作,理论上您只需将“,”替换为关闭和打开 &lt;dc:subject&gt; 以及其间的换行符,然后输出到新文件。 但是 sed 似乎不喜欢 html 尖括号...我尝试转义它们,但在包含它们时仍然会收到错误消息。到目前为止,这是我所有的时间,所以如果我有机会回到它,我会的。也许其他人可以解决尖括号问题:

      sed s/, /&lt;/dc:subject&gt;\n&lt;dc:subject&gt;/g file.txt &gt; G:\newfile.txt

      好吧,我想我明白了。基本上必须将包含尖括号的替换文本放在双引号中,并将 sed 使用的分隔符更改为正斜杠以外的其他内容,因为这是在替换文本中,而 sed 不喜欢它。我对 grep 了解不多,但读到 grep 只匹配事物,而 sed 将替换,因此更适合这种类型的事物:

      sed s%", "%"</dc:subject>\n<dc:subject>"%g file.txt > newfile.txt
      

      【讨论】:

      • 非常感谢。我对 sed 一点也不熟悉,但会看看我能不能弄明白。
      【解决方案5】:

      您无法通过普通的 grep 执行此操作。但是您可以为 BBEdit 添加一个“Unix 过滤器”来为您完成这项工作:

      #!/usr/bin/perl -w
      
      while(<>) {
      my $line = $_;
      $line =~ /<dc:subject>(.+)<\/dc:subject>/;
      my $content = $1;
      my @arr;
      
      if ($content =~ /,/) {
          @arr = split(/,/,$content);
      }
      my $newline = '';
      foreach my $part (@arr) {
          $newline .= "\n" if ($newline ne '');
          $part =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
          $newline .= "<dc:subject>$part</dc:subject>";
      }
      print $newline;
      }
      

      如何将此 UNIX 过滤器添加到 BBEdit,您可以在“安装”部分阅读此 URL:http://blog.elitecoderz.net/windows-zeichen-fur-mac-konvertieren-und-umgekehrt-filter-fur-bbeditconverting-windows-characters-to-mac-and-vice-versa-filter-for-bbedit/2009/01/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-17
        • 1970-01-01
        • 2022-01-26
        • 2014-02-14
        • 1970-01-01
        相关资源
        最近更新 更多