2016-08-19 2 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()' 

Что я делаю неправильно?

Причина, по которой я не помещаю это в файл, я делаю все это из файла Docker.

+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, char 222: неизвестный параметр '' s'' – fredrik

+1

Вы должны убедиться, что $ hack содержит регулярное выражение в синтаксисе Sed. Ваш пример показывает, что это не так. Ваш вопрос заключается не в том, как развернуть, а как процитировать. – ceving

ответ

1

Вам нужно будет избежать новой строки, так что становится:

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

Один из способов заключается в использовании СЭД для него:

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

И в вашем случае, кажется, вы могли бы быть в состоянии использовать a после вместо s ubstitute:

$ 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 

(Обратите внимание, что это вставляет данные после первой линии, и полностью игнорирует содержание этой строки Из формулировки вопроса, который, кажется, что вы хотите.).

Смежные вопросы