【问题标题】:Replace multiple lines of file in Shell with variable用变量替换Shell中的多行文件
【发布时间】:2014-12-06 04:54:19
【问题描述】:

我有一个txt文件:

A
B
<anything>
C
D

我想用字符串替换文件中的 B 到 C,但这不匹配:

sed -i -e "s/B.*C/replace/g" $fileName

我找到了如何定位多行字符串:

awk '/B/,/C/' $fileName

【问题讨论】:

    标签: regex bash shell sed scripting


    【解决方案1】:
    $ awk '/B/{print "Replacement Text"} /B/,/C/{next} 1' "$fileName" 
    A
    Replacement Text
    D
    

    awk代码解释:

    • /B/{print "Replacement Text"}

      当我们看到B 行时,打印出新文本,不管它是什么。

    • /B/,/C/{next}

      BC 之间的任何一行,跳过其余命令并跳转到下一行。

    • 1

      这是awk 打印当前行的简写。

    可变文本

    如果替换文本在shell变量newtext中,则使用:

    awk -v new="$newtext" '/B/{print new} /B/,/C/{next} 1'
    

    就地修改文件

    如果您有 GNU awk v4.1.0 或更高版本:

    $ awk -i inplace '/B/{print "Replacement Text"} /B/,/C/{next} 1' "$fileName" 
    

    对于早期版本:

    awk '/B/{print "Replacement Text"} /B/,/C/{next} 1' "$filename" >tmp && mv tmp "$filename"
    

    【讨论】:

    • 我正在尝试修改文本文件而不仅仅是打印
    • 如果替换文本是一个变量怎么办?
    • @user2827214 假设替换文本位于 shell 变量中,请参阅更新后的答案。如果没有,请告诉我替换文本的来源。
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '/B/,/C/c\replacement' file
    

    或:

    var=replacement; sed '/B/,/C/c\'$var file
    

    【讨论】:

      猜你喜欢
      • 2015-03-10
      • 2019-03-24
      • 2023-01-11
      • 2012-12-18
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多