【问题标题】:How to replace a line using sed command after first occurence?首次出现后如何使用 sed 命令替换一行?
【发布时间】:2014-05-07 14:53:43
【问题描述】:

我正在使用 sed 命令在关键字第一次出现后替换行。 当我找到关键字时,我正在使用以下命令替换整行。

sed -i "/<port>/c<port>=$a" /root/output.txt

但我的文件是这样的

<namenode>
   <port>8080</port>
</namenode>
<derby>
   <port>5050</port>
</derby>

在这种情况下,如果我运行上面的命令,它将同时更改 namenode 的端口和 derby 的端口。但 我想更改特定行。我将在&lt;namenode&gt; 之后搜索&lt;port&gt; 的第一次出现,因此它只会更改namenode 的端口值而不是derby 的端口值。 我正在使用上面的命令更改整行。 我希望我能得到这个问题的答案。

【问题讨论】:

    标签: sed


    【解决方案1】:

    据我了解,您只想更改名为namenode 的部分中的端口。在这种情况下:

    sed -i "/<namenode>/,/<\/namenode>/ s/<port>[0-9]\+/<port>$a/" /root/output.txt
    

    使用/&lt;namenode&gt;/,/&lt;\/namenode&gt;/ 将替换命令的操作限制在第一行包含&lt;namenode&gt; 和最后一行包含&lt;/namenode&gt; 的行组。在该范围内,任何端口号都将替换为 shell 变量 $a 的值。

    【讨论】:

    • 和你一样的概念:-)
    • 它仅在 时有效,但假设我在 之间有一些行,即 sakdma 那么它不会替换文本
    • @sandy_ws 我刚刚尝试了那个例子,即使有中间行,它也适合我。如果问题仍然存在,请提供(可能在问题正文中)导致问题的确切文件的精确副本以及可能出现的任何错误消息。
    【解决方案2】:
    sed -i "/^<namenode>/,/<\/namenode>/ {
       /<port>/c<port>=$a
       }" /root/output.txt
    

    封装到另一个块中

    【讨论】:

      【解决方案3】:

      这里是一个使用awk的例子

      a=9090
      awk '/<namenode>/ {f=1} f && /<port>/ {$0="   <port>"new"</port>";f=0}1' new="$a" file
      <namenode>
         <port>9090</port>
      </namenode>
      <derby>
         <port>5050</port>
      </derby>
      

      它只会将namenode之后的port更改为存储在变量a中的值


      它是如何工作的:

      awk '
      /<namenode>/ {                  # If the line contains "<namenode>"
          f=1}                        # do set flag `f` to `1` (true)
      f && /<port>/ {                 # If flag `f` is true and line contains "<port>"
          $0="   <port>"new"</port>"  # change line to new data
          f=0}                        # and reset flag `f`
      1                               # Do default action (print the line)
      ' new=10 file                   # Read variable and the file
      

      使用范围函数:

      awk '/<namenode>/,/<\/namenode>/ {if (/<port>/) $0="   <port>"new"</port>"}1' new="$a" file
      

      【讨论】:

      • 我只使用 sed,但第一次尝试使用 awk...太棒了,谢谢。
      • HI Jotne 在替换它刚刚在控制台上打印的值后...如何在文件中更改它。
      • @sandy_ws 你这样做是为了在文件中替换:awk 'code' file &gt; tmp &amp;&amp; mv tmp file
      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2018-09-16
      • 2020-12-09
      相关资源
      最近更新 更多