【问题标题】:Bash - Comment out a specific line that partly matches a string in a fileBash - 注释掉与文件中的字符串部分匹配的特定行
【发布时间】:2014-09-21 00:01:19
【问题描述】:

我有一个带参数的文件

testArgument=

它可能有相同的东西或什么都没有,但我想评论它并使用提供的信息添加新行

之前:

testArgument=Something

结果:

#testVariable=Something

#Comments to let the user know of why the change
testVariable=NewSomething

我应该循环它还是应该使用sed 之类的东西?我需要它兼容 Ubuntu 和 Debian 以及 bash。

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    你可以像这样使用 sed:

    sed 's/^\(testArgument\)=.*/#&\n\n#Comment here\n\1=NewSomething/' file
    

    & 打印替换中的完整匹配,\1 指的是第一个捕获组“testArgument”。

    要对文件执行就地替换(即替换原始文件的内容),请添加-i 开关。否则,如果要将命令输出到新文件,请执行sed '...' file > newfile

    如果您使用的是不支持 \n 换行符的不同版本的 sed,请参阅 this answer 了解一些处理方法。

    或者,使用 GNU awk:

    gawk '/^testArgument/ {$0 = gensub(/^(testArgument)=.*/, "#\\0\n\n#Comment here\n\\1=NewSomething", 1)}1' file
    

    【讨论】:

    • 您所说的“就地文件”是什么意思?我需要保留同一个文件,因为文件中还有其他数据。这会创建一个新文件吗?
    • 我可以添加额外的要求吗?可能会更难。 'testArgument' 可能已经被注释了,所以在这种情况下,只需在该行下添加新行。但如果没有评论,那么评论并在之后添加新行。
    • 我搞砸了。参数后我的文件中没有等号。我想我可以用这个 sed 's/^(testArgument).*/#&\n\n#Comment here\n\1 NewSomething/' 文件来重写你的语句
    • 这可能是因为您的种子版本不支持替换字符串中的换行符。我链接到的问题解释了如何处理。
    • 如果你有机会,看看这个问题。 stackoverflow.com/questions/25952293/…谢谢你的帮助!
    【解决方案2】:

    您可以使用awk

    awk '/^testArugment/ {$0="#"$0"\n\n#Comments to let the user know of why the change\ntestVariable=NewSomething"}1' file
    

    cat file
    some data
    testArugment=Something
    more data
    
    awk '/^testArugment/ {$0="#"$0"\n\n#Comments to let the user know of why the change\ntestVariable=NewSomething"}1' file
    some data
    #testArugment=Something
    
    #Comments to let the user know of why the change
    testVariable=NewSomething
    more data
    

    更改原始文件

    awk 'code....' file > tmp && mv tmp file
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 2020-01-06
      • 2015-12-31
      相关资源
      最近更新 更多