2016-08-19 61 views
0

我正在設置變量$hack,我想在a text file的第一行之後擴展和插入。第一行包含這樣的文字: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'兩次是錯字? – Sundeep

+0

錯字固定。 'sed -i「/ project(libpyside)/ r $ {hack}」CMakeLists.txt「給了我'sed:-e表達式#1,字符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 

(請注意,此插入數據的第一行後,完全忽略該行的內容從的問題,這似乎是你想要的措辭。)