sed变量替换

时间:2010-06-19 10:10:37

标签: bash string sed

我已经尝试过无数种方式,时间放弃并向主人询问......

#!/bin/bash

# Read in the VERSION.header file, this is a plain text file
# with returns, which in some of my tests, I am loosing the returns and getting
# one string wrapped only by the shell width
VERSION_HEADER=`cat VERSION.header`

sed 's/_VERSION_HEADER_/"$VERSION_HEADER"/g' DOCUMENTATION

字符串'_VERSION_HEADER_'当前存在于文档DOCUMENTATION中的第1行。文件'VERSION.header'中有大约18行。

我不喜欢使用sed。我所要做的就是读取一个充当模板的文件,将文件数据存储为变量,读入第二个文件,将其存储为变量。在第二个文件中查找标记,将标记替换为第一个文件中的数据。

示例:

$ cat VERSION.header

hi, this is my header file, how are you today
good, that is nice, great
have a nice day, k, thx, bye.

$ cat DOCUMENTATION

_VERSION_HEADER_

# This is a documentation file, please read it
# If you do not read it, you will get stuck to the toilet.

结果应该是:

嗨,这是我的头文件,你今天好吗 好的,那很好,很棒 祝你有美好的一天,k,thx,再见。

#这是一个文档文件,请阅读它 #如果你不读它,你就会被困在马桶上。

7 个答案:

答案 0 :(得分:1)

尝试一下:

sed -e '/_VERSION_HEADER_/{r VERSION.header' -e ';d}' DOCUMENTATION

在找到模板字符串时读取文件,然后删除模板字符串。

答案 1 :(得分:0)

sed -i "s/_VERSION_HEADER_/$VERSION_HEADER/g" DOCUMENTATION

修改

抱歉,终于解决了你的问题。你有一个多线模式。 This可能有所帮助。另请考虑使用Python:

#!/usr/bin/env python

f = open('doc.txt', 'r')
doc = f.read()
f.close()

f = open('VERSION.header', 'r')
versionHeader = f.read()
f.close()

doc = doc.replace('_VERSION_HEADER_', versionHeader)
print doc

但这可能效率较低。

答案 2 :(得分:0)

AWK

awk 'FNR==NR{s=s" "$0"\n";next}/_VERSION_HEADER_/{$0=s}1' version.header documentation

答案 3 :(得分:0)

也许看看男士1编辑:

# http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed
[[ $(grep -c _VERSION_HEADER_ DOCUMENTATION) -eq 1 ]] && \
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s DOCUMENTATION
   H
   /_VERSION_HEADER_/i
   .
   .c
   .
   .r VERSION.header
   wq
EOF

答案 4 :(得分:0)

使用(FreeBSD)sed做类似的事情:

VERSION_HEADER="$(sed -E -e 's/\\/\\\\/g' -e 's/&/\\\&/g' -e 's|/|\\/|g' -e 's/$/\\/g' VERSION.header)"

# note the space after ${VERSION_HEADER}
sed -E -i "" "/_VERSION_HEADER_/s/_VERSION_HEADER_/${VERSION_HEADER} /" DOCUMENTATION

答案 5 :(得分:0)

你需要转义你的文字:

  if ContentType = '' then begin
    if (ContentText <> '') or (Assigned(ContentStream)) then begin
      ContentType := 'text/html; charset=ISO-8859-1'; {Do not Localize} 

答案 6 :(得分:-1)

这样的事情怎么样:

#!/bin/bash

while read oneline; do
    VERSION_HEADER=${VERSION_HEADER}'\n'${oneline};
done < VERSION.header

sed 's/_VERSION_HEADER_/'"${VERSION_HEADER}"'/g' DOCUMENTATION