Bash sed变量替换
我试过无数种方法,是时候认输了,去问大师Bash sed变量替换,bash,string,sed,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.he
#!/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
字符串“\u VERSION\u HEADER”当前作为文件文档中的第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文档
_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,再见。
#这是一个文档文件,请阅读
#如果你不读,你会被困在厕所里
sed -i "s/_VERSION_HEADER_/$VERSION_HEADER/g" DOCUMENTATION
编辑
对不起,你终于有麻烦了。你有一个多线模式。也许会有帮助。还考虑使用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
不过,这可能效率较低。像这样的东西怎么样:
#!/bin/bash
while read oneline; do
VERSION_HEADER=${VERSION_HEADER}'\n'${oneline};
done < VERSION.header
sed 's/_VERSION_HEADER_/'"${VERSION_HEADER}"'/g' DOCUMENTATION
#/bin/bash
读一行的时候;做
VERSION\u HEADER=${VERSION\u HEADER}'\n'${oneline};
完成
尝试一下:
sed -e '/_VERSION_HEADER_/{r VERSION.header' -e ';d}' DOCUMENTATION
在找到模板字符串时读取文件,然后删除模板字符串。awk
awk 'FNR==NR{s=s" "$0"\n";next}/_VERSION_HEADER_/{$0=s}1' version.header documentation
也许还可以看看《男人1》中的ed:
# 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
#http://wiki.bash-hackers.org/doku.php?id=howto:edit-
[[$(grep-c版本头文档)-等式1]&&\
cat使用(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
您需要转义您的文本:
text=$( cat VERSION.header );
escaped_text=$( echo "$text" | sed 's/[/\\&]/\\&/g;s/$/\\/;$s/\\$//' )
sed "s/_VERSION_HEADER_/$escaped_text/g" DOCUMENTATION
您得到的结果是什么?可能是重复的感谢,现在尝试将其保存在bash中,以便它可以移植到不总是使用python的系统中。Getting err:sed:1:“DOCUMENTATION”:D命令末尾的额外字符我收到一个错误:sed:1:“D}\n”:D命令末尾的额外字符command@allentown:使用GNU sed 4.2.1它对我有效。您有什么版本(以及什么操作系统和版本)?@user170579:尝试不使用分号-一些版本的sed
不喜欢它们。d
和}
应该是单独的命令:sed-e'/\u version\u HEADER./{r version.HEADER'-e'}'DOCUMENTATION
@TobySpeight:GNUsed
中不需要这样做,但在OS X中需要这样做。我在这个答案中使用-e
的唯一原因是为了能够终止r
命令的文件名参数。