我设置了我希望展开的变量$hack
,并在a text file的第一行之后插入。第一行包含以下文字:project(libpyside)
试过这个:
$ 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 :(得分:1)
您将需要转义换行符,使其变为:
sed 's|...|...\
...\
...|' CMakeLists.txt
一种方法是使用sed:
$ 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
答案 1 :(得分:0)
我会将数据放入文件中。除此之外,试试:
echo "$hack" | sed '1r/dev/stdin' CMakeLists.txt
(请注意,这会在第一行之后插入数据,并完全忽略该行的内容。从问题的措辞来看,这似乎是您想要的。)