我有一个文件,其内容如下:
[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
答案 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