2016-08-19 4 views
0

に最初の行の後に展開して挿入する変数$hackを設定しています。 project(libpyside)sedを使用するときに変数を展開する方法は?

この試みた:

$ sed -i "s|project(libpyside)|project(libpyside)\n$hack|" CMakeLists.txt 
sed: -e expression #1, char 124: unterminated `s' command 
...と、この:

$ sed -i "/project(libpyside)/ r $hack" CMakeLists.txt 
sed: -e expression #1, char 222: unknown option to `s' 

...と、この:

$ sed -i -e "2i${hack}" CMakeLists.txt 
sed: -e expression #1, char 201: unknown option to `s' 

はこれが最初の行は、このテキストが含まれています私の$hack変数:

hack='#HACK: CMake with broken Qt5Qml_PRIVATE_INCLUDE_DIRS, Qt5Quick_PRIVATE_INCLUDE_DIRS 
if(${Qt5Qml_FOUND}) 
    if(NOT "${Qt5Qml_PRIVATE_INCLUDE_DIRS}" MATCHES "/QtQml/") 
    string(REPLACE "/QtCore" "/QtQml" replaceme "${Qt5Core_PRIVATE_INCLUDE_DIRS}") 
    list(APPEND Qt5Qml_PRIVATE_INCLUDE_DIRS ${replaceme}) 
    list(REMOVE_DUPLICATES Qt5Qml_PRIVATE_INCLUDE_DIRS) 
    endif() 
endif() 
if(${Qt5Quick_FOUND}) 
    if(NOT "${Qt5Quick_PRIVATE_INCLUDE_DIRS}" MATCHES "/QtQuick/") 
    string(REPLACE "/QtCore" "/QtQuick" replaceme "${Qt5Core_PRIVATE_INCLUDE_DIRS}") 
    list(APPEND Qt5Quick_PRIVATE_INCLUDE_DIRS ${Qt5Qml_PRIVATE_INCLUDE_DIRS}) 
    list(APPEND Qt5Quick_PRIVATE_INCLUDE_DIRS ${replaceme}) 
    list(REMOVE_DUPLICATES Qt5Quick_PRIVATE_INCLUDE_DIRS) 
    endif() 
endif()' 

私は間違っていますか?

これをファイルに入れないのは、私がDockerfile内からこのすべてをやっているからです。

+0

を変数を使用するよりも良いです... http://stackoverflow.com/questions/16715373/insert-contents-of-a-file-after-specific-pattern-match ..そして 'sed -i'は2回タイプミスですか? – Sundeep

+0

入力ミスが修正されました。 "sed -i"/project(libpyside)/ r $ {hack} "CMakeLists.txt'は' sed:-e式#1、char 222:\ 's"に未知のオプションを与えます – fredrik

+1

あなたは、 $ hackにはSed構文の正規表現が含まれています。あなたの例は、これが当てはまらないことを示しています。あなたの質問は拡大する方法ではなく、引用する方法です。 – ceving

答えて

1

あなたはそれがなるように改行をエスケープする必要があります。

sed 's|...|...\ 
...\ 
...|' CMakeLists.txt 

一つの方法は、それのためにsedを使用することです:

$ hack=$'hello\nworld' 
$ sed '$!s/$/\\/' <<< "$hack" 
hello\ 
world 

そして、あなたの代わりにs ubstituteの後aを使用することができるかもしれないそうです、あなたの場合:

$ hack=$(sed '$!s/$/\\/' <<< "$hack") 
$ sed -i '/project(libpyside)/a'"$hack" CMakeLists.txt 

その場合は、プロセス置換を使用して、代わりに読むかもしれないが

$ sed -i '/project(libpyside)/'r<(printf "%s" "$hack") CMakeLists.txt 
0

データをファイルに入れます。してみてください、ということバーリング:

echo "$hack" | sed '1r/dev/stdin' CMakeLists.txt 

を(これは最初の行の後にデータを挿入し、完全にその行の内容を無視することに注意してください質問の文言からは、あなたが望むもののように見えるという。)

関連する問題