【问题标题】:Find a pattern and replace the whole line & find a pattern and insert after找到一个模式并替换整行并找到一个模式并在之后插入
【发布时间】:2013-10-23 14:56:39
【问题描述】:

问题一:

图案:

test_$(whoami)

变量:

var1=$(pwd)

我想找到模式并将整行替换为var1

sed -i "s/.*test_$(whoami).*/$var1/" test.txt

它给了我 sed: -e expression #1, char 28: unknown option to `s'

问题 2。

图案:

#####Insert here#####

要插入的内容:包括 $var1/file_$(whoami).txt

我想找到与模式匹配的行(完全匹配),并在后一行插入内容

sed -i "s/#####Insert here#####/include $var1/file_$(whoami).txt" test.txt

也不行

有人可以帮忙吗?

【问题讨论】:

    标签: regex linux bash replace sed


    【解决方案1】:

    问题 1。 似乎 $var1 包含一个解释为 sed 分隔符的字符,即:'/'。

    substitute 命令中,在第三个分隔符之后,sed 需要一个出现次数,并且您可能正在提供文本。

    例如,如果:

    var1="~/myDirectory" 
    

    然后这会产生一个带有太多分隔符的 sed 命令:

    sed -i 's/.*test_$(whoami).*/~/myDirectory/"
    

    您应该使用不同的分隔符,例如 ~、#、!、?、&、| ...您的正则表达式中不存在的一个。 Sed 将自动识别 substitute 命令后的分隔符,并允许您在 正则表达式中使用“/”字符:

    sed "s#~/toto#~/tata#"
    

    如果您在查找正则表达式中不存在的字符时遇到困难,可以使用在您的模式中不太可能存在的不可打印字符。例如,如果你的 shell 是 bash

    $ echo '/~#' | sed s$'\001''/~#'$'\001''!?\&'$'\001''g'
    

    在此示例中,bash$'\001' 替换为具有八进制值 001 的字符 - 在 ASCII 中,它是 SOH 字符(标题的开头)。

    由于此类字符是控制/不可打印字符,因此它们是否会存在于模式中是值得怀疑的。除非,也就是说,你正在做一些奇怪的事情,比如修改二进制文件 - 或没有正确区域设置的 Unicode 文件。

    问题 2。 您可能正在寻找 sed 的附加函数 ('a'):

     sed -i "/#####Insert here#####/ a include $var1/file_$(whoami).txt"  test.txt
    

    【讨论】:

      【解决方案2】:

      关于问题1。使用不同的正则表达式分隔符:

      sed -i.bak "s~^.*test_$(whoami).*$~$var1~" test.txt
      

      因为$var1可以包含/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 2018-02-08
        • 2021-07-23
        • 1970-01-01
        • 2016-12-17
        相关资源
        最近更新 更多