使用sed时如何扩展变量?

时间:2016-08-19 15:27:59

标签: bash ubuntu sed

我设置了我希望展开的变量$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中做了所有这些。

2 个答案:

答案 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

(请注意,这会在第一行之后插入数据,并完全忽略该行的内容。从问题的措辞来看,这似乎是您想要的。)