前段时间我发布了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
答案 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}}