2014-03-03 62 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

相關問題