用于修改自身的bash脚本的sed puzzle

时间:2017-01-25 20:40:26

标签: bash replace sed

前段时间我发布了this。它是关于一个修改自身的脚本,一切都运行正常,可以在sed正则表达式中放置一个[],以避免修改sed行,让它找到正确的一行。

好的,现在非常相似,但有点复杂。在另一篇文章中,要搜索的行是静态的。现在我们有几个选项。所以,有时代码是这样的(看看带有“set = x”的行):

#!/bin/bash
possible_locations=(
            "/somewhere/path/"
            "/another/different/path/"
            #Custom location (set=0)
            )
#Here goes my sed line

其他时候代码是:

#!/bin/bash
possible_locations=(
            "/somewhere/path/"
            "/another/different/path/"
            "/other/one/path/" #Custom location (set=1)
            )
#Here goes my sed line

保持并关注线条开头的标签缩进。

好的,我想要的是修改脚本本身(使用sed -i)与正则表达式匹配这两种可能性,而不匹配sed行本身(如在另一篇文章中)和替换它(set = x)两种情况下的行:

            "/new/path/" #Custom location (set=1)

所以我想替换一行(保留相同的标签缩进),有时只有#Custom location (set=0)"/other/one/path/" #Custom location (set=1)有时会"/new/path/" #Custom location (set=1)

我尝试了不同的组合捕获组等...但无法使其工作。我想我很亲密!这是我的非工作sed系列:

sed -i "s/^\(.*\)#[C]ustom location (set=[0-1])/\1\"\\/new\\/path\\/\" #Custom location (set=1)/" "/path/to/this/script.sh" 2> /dev/null

1 个答案:

答案 0 :(得分:1)

您可以使用以下保留空格和空格的内容。标签:

NEW_PATH=\"/new/path/\"

sed -ri "s_(\s+|\t+)([^ ]*)(\s*#Custom location \(set=)([0-9]+)(\))_\1$NEW_PATH \31\5_" test.conf

使用以下组:

  • (\s+|\t+)匹配任何空格或标签
  • ([^ ]*)匹配除空格之外的任何内容(对于“path_string”,如果存在)
  • (\s*#Custom location \(set=)匹配评论,直到设置=
  • ([0-9]+)匹配设定值
  • (\))与结束)
  • 相匹配

被替换的分组为\1$NEW_PATH \31\5(1用于set值)

请注意,我在$NEW_PATH变量之后添加了一个额外的空格,用于案例n°1,其中评论前没有空格

另请注意,我使用了_ sed分隔符而不是/,这会与$NEW_PATH的{​​{1}}

冲突