【问题标题】:Find lines that don't begin with a "<", perform action查找不以“<”开头的行,执行操作
【发布时间】:2011-01-17 00:27:17
【问题描述】:

我正在使用 vim,并且有一个包含 一些 html 的大文本文件被扔进了 throoghout。我正在尝试为网络做准备,需要在尚未格式化的行中添加&lt;p&gt;&lt;/p&gt; 标签。这是我所拥有的示例:

Paragraph text one one line [... more ... ]
Other paragraph text on the next line [... more ... ]  
<h1>html element thrown in on its own line</h1>
More paragraph text [... more ... ]  
<!-- some other element (always own line) -->
There is still more text!

我正在寻找一种方法来搜索 &lt; 字符开头的行,并为这些行添加开始和结束 &lt;p&gt;&lt;/p&gt; 标记...所以之后,我的文件类似于:

<p>Paragraph text one one line [... more ... ] </p>
<p>Other paragraph text on the next line [... more ... ]   </p>
<h1>html element thrown in on its own line</h1>
<p>More paragraph text [... more ... ]   </p>
<!-- some other element (always own line ) -->
<p>There is still more text! </p>

如何找到&lt;开头字符匹配的行?

【问题讨论】:

    标签: regex vim sed


    【解决方案1】:
    ^([^<].*)$
    

    确保您的选项不允许“点匹配换行符”并替换为:

    <p>$1</p>
    

    Vim 要求您转义某些字符,但我实际上没有 vim,所以这是我对整个规则的最佳猜测:

    s:^\([^<].*\)$:<p>\1</p>:g
    

    【讨论】:

    • 不允许点匹配换行符是什么意思?对不起,我是 vim 的新手。我使用了%s:^\([^&gt;].*\)$:&lt;p&gt;\1&lt;/p&gt;:g 并将段落标签添加到 every 行(甚至那些已经带有标签的行)。快到了……
    • 最后一个表达式中的尖括号指向错误的方向。 [^&gt;] 应该是 [^&lt;]
    • @thornomad:抱歉,Nefrubyr 是正确的。尖括号错了。我已经更正了这条线。
    【解决方案2】:
    :%s/^[^<].*/<p>&<\/p>/
    

    或者:

    :v/^</s#.*#<p>&</p>#
    

    这就是我们所需要的。

    【讨论】:

      【解决方案3】:

      这是逻辑。浏览文件,在行首检查&lt;,如果没有,用&lt;p&gt;&lt;/p&gt; 构造一个新字符串并将其回显。真的不需要复杂的正则表达式

      用 bash

      #!/bin/bash
      shopt -s extglob
      while read -r line
      do
          case "$line" in
              "<"*) echo $line ;;
              *) echo "<p>$line</p>";;
          esac   
      done <"file"
      

      使用 awk

      $ awk '!/^</{$0="<p>"$0"</p>"}{print}' file
      

      输出

      $ awk '!/^</{$0="<p>"$0"</p>"}1' file
      <p>Paragraph text one one line [... more ... ]</p>
      <p>Other paragraph text on the next line [... more ... ]  </p>
      <h1>html element thrown in on its own line</h1>
      <p>More paragraph text [... more ... ]  </p>
      <!-- some other element (always own line) -->
      <p>There is still more text!</p>
      

      【讨论】:

      • “无需复杂的正则表达式”,您正在提供需要启动外部工具的解决方案?
      • vim,对于外壳来说,也是一个外部工具。无论是 awk、sed、vim、ed 等,所有这些工具都会对文件进行处理!他们之间真的没有太大的区别。即使是普通的旧外壳也可以用来“编辑”文件。不,如果这就是你所说的,我的解决方案不是从 vim 启动的。它们从命令行运行。
      • OP 说他正在运行 vim。所以调用 shell/bash 的东西是外部的。
      • OP 也放了一个 sed 标签,然后给出什么?在他的情况下使用 vim 的缺点。他有一个大文件。不是说 vim 不能支持大文件,但是如果他要编辑一个大文件,他最好使用 awk/sed 而不是 vim(在交互模式下)。另一个缺点,在vim中只做一次。把edit命令放到脚本里还是比较好下次再用。
      【解决方案4】:

      这应该可行:

      :%s/^\s*[^<]\+$/<p>&<\/p>/g
      

      【讨论】:

      • 它必须以
      • 我不会。我的正则表达式不处理空行。不会有

      【解决方案5】:

      另一种方法:

      :v/^</normal I<p>^O$</p>
      

      ^O 实际上是按 CTRL+o 完成的

      或者,如果您使用surround.vim 插件:

      :v/^</normal yss<p>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        • 2022-08-11
        • 1970-01-01
        • 2015-07-26
        • 2014-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多