2014-03-03 56 views
1

我有一个文件“的.gitignore”包含为bash shell中添加一个新行的文件后,模式匹配发现

src/abc 
src/line 
src/another 

我想补充另一条线的各种源文件名“SRC /line.cpp “匹配后发现,” SRC /线路“ 结果会是什么样子作为

src/abc 
src/line 
src/line.cpp 
src/another 

我使用SED为

set -- "$File" // $File contains src/line 
IFS="/"; declare -a Array=($*) 
echo "${Array[0]}" // This prints src 
echo "${Array[1]}" // This prints line 

sed -i '/$Array[0]\/$Array[1]/a $Array[0]\/$Array[1].cpp' $File 

sed命令不起作用。 我有一种感觉,斜杠没有妥善处理。如果我硬编码为

sed -i '/src\/line/a src\/line.cpp' $File 

然后它工作。 任何解决方案?提前致谢!

+1

@fedorqui:这不是一个重复; OP的工作线路与您的建议副本相匹配。相反,OP的问题是使用单引号'''而不是双'''。 –

回答

1

随着GNU sed的,你可以不喜欢它:

sed -i.BAK 's_src/line_\0\n\0.txt_' 

,因为它允许使用其他分隔符不是斜线。

+0

感谢您的快速回复,它可以工作,但不是在我使用变量时。sed -i.BAK's_ $ Array [0]/$ Array [1] _ \ 0 \ n \ 0.cpp_'.gitignore – user3375257

+0

为此,您必须使用'''作为引号字符。 –

2

您正确使用echo "${Array[1]}"中的双引号以及数组索引所需的大括号{}。但是您忽略在sed行中这样做。因此,尝试:

sed -i "/${Array[0]}\/${Array[1]} *$/a ${Array[0]}\/${Array[1]}.cpp" .gitignore 

我在这里增加了一个额外$为行的末尾,所以:

  • 重复命令离开该文件不变
  • 减少无意的风险相匹配

空间星级美元*$处理,其中一条线具有在最后空格的情况。您可能还需要添加^以匹配行首。

此外,您sed命令上$File工作;我想你想要.gitignore

但是,而不是摆弄IFS和数组,这可能是清洁剂使用bash的参数替换。更换${Array[0]}${Array[1]}有:

${File%/*} 
    ${File#*/} 

最后,你甚至都不需要做,如果你有例如@更换sed的斜线/(但强调_会很糟糕,因为它是在常用的文件名)。

所以倒数第二的命令行是:

sed -i "\@[email protected] $File.cpp" .gitignore 

,或者在一行的末端把手空白,避免虚假匹配:

sed -i "\@$File *\[email protected] $File.cpp" .gitignore 

注只有第一个@被转义。

+1

谢谢!这些工作正常! – user3375257

相关问题