如何匹配两个定界符之间的字符串并在后面添加字符串

时间:2019-07-26 02:29:29

标签: bash shell awk sed scripting

我有一个文件,其内容如下:

[idx1]
path1 = $test/idx1/test
path2 = $test/idx1/test
path3 = $test/idx1/test

[idx2]
path1 = $test/idx2/test
path2 = $test/idx2/test
path3 = $test/idx2/test

有没有办法在定界符之间匹配所有字符串,例如idx1,idx2,并在每次匹配后附加一个字符串。

[idx1_string]
path1 = $test/idx1_string/test
path2 = $test/idx1_string/test
path3 = $test/idx1_string/test

[idx2]
path1 = $test/idx2_string/test
path2 = $test/idx2_string/test
path3 = $test/idx2_string/test

4 个答案:

答案 0 :(得分:1)

一个简单的sed扩展正则表达式表达式可以实现您的目标:

sed -r 's/idx(\w+)/idx\1_string/' file

该表达式使用匹配\w的单词match [a-zA-Z0-9]

要就地编辑文件,请添加-i作为选项,并在就地编辑时保留扩展名为.bak的原始副本,只需将选项添加为{{ 1}}。

使用/输出示例

对于您的输入文件,使用和输出示例为:

-i.bak

答案 1 :(得分:0)

sed -e "s/\/idx\([0-9]\)\//\/idx\1_string\//" filename

也如评论中所建议:

sed  -e "s/\/idx\([0-9]\)\//\/idx\1_string\//" -e "s/\[idx1\]/\[idx1_string\]/" filename

这应该可以解决问题。

由于您仅在第一个方括号中进行了修改,因此我想您不需要更改[idx2],因为您需要单独的sed匹配项。但是,如果需要在任何定界符之间匹配该特定字符串,只需在诸如\之类的范围内包括定界符([[<delimeters>]等)即可。

答案 2 :(得分:0)

如果您想全部更改

sed -r 's/(idx[0-9])/\1_string/' file
[idx1_string]
path1 = $test/idx1_string/test
path2 = $test/idx1_string/test
path3 = $test/idx1_string/test

[idx2_string]
path1 = $test/idx2_string/test
path2 = $test/idx2_string/test
path3 = $test/idx2_string/test

如果标题不应该更改。

sed -r 's|(idx[0-9])/|\1_string/|' file
[idx1]
path1 = $test/idx1_string/test
path2 = $test/idx1_string/test
path3 = $test/idx1_string/test

[idx2]
path1 = $test/idx2_string/test
path2 = $test/idx2_string/test
path3 = $test/idx2_string/test

答案 3 :(得分:0)

您的问题尚不清楚,但您似乎可能正在询问如何执行以下任一操作:

$ sed 's:/\([^/]*\)/:/\1_string/:' file
[idx1]
path1 = $test/idx1_string/test
path2 = $test/idx1_string/test
path3 = $test/idx1_string/test

[idx2]
path1 = $test/idx2_string/test
path2 = $test/idx2_string/test
path3 = $test/idx2_string/test

$ sed 's:\([[/]\)\([^/]*\)\([]/]\):\1\2_string\3:' file
[idx1_string]
path1 = $test/idx1_string/test
path2 = $test/idx1_string/test
path3 = $test/idx1_string/test

[idx2_string]
path1 = $test/idx2_string/test
path2 = $test/idx2_string/test
path3 = $test/idx2_string/test