【问题标题】:Insert a line of text in the end of a function在函数末尾插入一行文本
【发布时间】:2017-05-14 20:00:11
【问题描述】:

如何在代码树的多个文件中存在的特定函数的末尾插入一行文本。
下面的示例
file1 - 位置 - /home/tmp/a/a.sh

hello()
{
   echo "line 1"
   echo "line 2"
   insert new line of text "good bye" here
}

file2 - 位置 - /home/tmp/b/b.sh

hello()
{
   echo "line 1"
   echo "line 2"
   echo "line 3"
   echo "line 4"
   insert new line of text "good bye" here
}

我尝试使用 sed 命令,但上面的场景看起来有点棘手。

【问题讨论】:

    标签: shell unix sed


    【解决方案1】:

    使用 GNU sed:

    sed '/^hello()/,/^}/s/^}/   insert new line of text "good bye" here\n&/' file
    

    如果您想“就地”编辑文件,请使用 sed 的选项 -i

    【讨论】:

    • 干得好;要使这项工作与 BSD/macOS Sed 一起工作,唯一需要做的是将最终的 \n 替换为 \ 后跟 actual 换行符,或者在 Bash 中将其替换为 '$'\\\n'' .
    • 这个解决方案对我有用。唯一的事情 \n 没有工作..我能够插入@mklement0 提到的一行
    【解决方案2】:

    基本思路是查找函数规范行直到函数结束行,并在该范围内,在函数结束行之前插入额外的文本:

    it59.sed

    /^hello()/,/^}/ { /^}/i\
        insert new line of text "goodbye" here
    }
    

    用法

    sed -f it59.sed file1.sh file2.sh
    

    或者,使用 GNU sed 进行原位编辑:

    sed -i -f it59.sed file1.sh file2.sh
    

    或者,使用 BSD 进行原位编辑sed

    sed -i '' -f it59.sed file1.sh file2.sh
    

    等等

    输入示例

    hello()
    {
       echo "line 1"
       echo "line 2"
       #insert new line of text "good bye" here
    }
    
    hello()
    {
       echo "line 1"
       echo "line 2"
       echo "line 3"
       echo "line 4"
       #insert new line of text "good bye" here
    }
    

    示例输出

    hello()
    {
       echo "line 1"
       echo "line 2"
       #insert new line of text "good bye" here
    insert new line of text "goodbye" here
    }
    
    hello()
    {
       echo "line 1"
       echo "line 2"
       echo "line 3"
       echo "line 4"
       #insert new line of text "good bye" here
    insert new line of text "goodbye" here
    }
    

    请注意,sed 忽略了前导空格。这很麻烦。解决这个问题有点困难。

    it61.sed

    /^hello()/,/^}/ { /^}/ { h; s/.*/   insert new line of text "goodbye" here/p; x; }; }
    

    对于从函数开头到函数结尾的范围,如果该行与函数结尾匹配,则将该行复制到保留空间,将该行替换为新文本并打印该行,并且交换保留空间。 } 后面的分号是 BSD sed 需要的,但 GNU sed 不需要。当然,那一行也可以写在命令行上。多行版本 (it59.sed) 在命令行上编写时需要小心 — 同样,GNU sed 与 BSD sed 有不同的规则,并允许 BSD sed 不允许的事情。 (在这些问题上,POSIX sed 比 GNU sed 更接近 BSD sed。)

    示例输出

    hello()
    {
       echo "line 1"
       echo "line 2"
       #insert new line of text "good bye" here
       insert new line of text "goodbye" here
    }
    
    hello()
    {
       echo "line 1"
       echo "line 2"
       echo "line 3"
       echo "line 4"
       #insert new line of text "good bye" here
       insert new line of text "goodbye" here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2017-11-26
      • 2021-11-01
      • 1970-01-01
      • 2021-07-21
      • 2020-11-15
      • 2015-02-08
      相关资源
      最近更新 更多