2013-06-25 41 views
0

林試圖讓下面的腳本工作,但有一些問題,即時通訊:UNIX腳本中使用sed的

g++ -g -c $1 
DWARF=echo $1 | sed -e `s/(^.+)\.cpp$/\1/` 

,並即時得到 - 在SED使用

./dcompile: line 3: test3.cpp: command not found 
./dcompile: command substitution: line 3: syntax error near unexpected token `^.+' 
./dcompile: command substitution: line 3: `s/(^.+)\.cpp$/\1/' 
sed: option requires an argument -- 'e' 

,然後一大堆東西。我想要做的是傳入一個cpp文件,然後提取沒有.cpp的文件名並將其放入變量DWARF中。我也想以後使用的變量矮做到以下幾點 -

readelf --debug-dump=info $DWARF+".o" > $DWARF+".txt"

但林不知道如何真正做到對飛弦concats,所以請這兩個問題的幫助。

回答

1

在BASH可以通過

${1%*.cpp} 

如果你需要設置矮VAR使用

剪切掉從$ 1的擴展
DWARF="${1%*.cpp}" 

或只是引用$ 1中

readelf --debug-dump=info "${1%*.cpp}.o" > "${1%*.cpp}.txt" 

將砍掉了最右邊的.cpp所以test.cpp.cpp將TEST.CPP

+0

工作完美,沒有凌亂的廢話。萬分感謝! –

0

您可以使用awk此:

$ var="testing.cpp" 
$ DWARF=$(awk -F. '{print $1}' <<< $var) 
$ echo "$DWARF" 
testing 
2

實際上,你需要執行以下命令:

DWARF=$(echo $1 | sed -e 's/(^.+)\.cpp$/\1/') 

錯誤消息是一個shell錯誤,因爲你原來的說法

DWARF=echo $1 | sed -e `s/(^.+)\.cpp$/\1/` 

實際上是這樣解析的

run s/(^.+)\.cpp$/\1/ 
set DWARF=echo 
run the command $1 | ... 

所以當它說test3.cpp: command not found我假設你正在使用的說法test3.cpp運行,它的字面試圖執行該文件

您還需要包裝sed腳本在單引號,不是反引號

+0

進出口仍然得到SED錯誤,當我試試這個。 –

+0

@ Dgrin91你需要使用文字引號,而不是反引號 – SheetJS

+0

謝謝你,你是對的。現在,我仍然得到一個更多的錯誤 - 'sed:-e表達式#1,字符17:無效的引用\ 1在's'命令的RHS上' –