Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed变量替换_Bash_String_Sed - Fatal编程技术网

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:GNU
sed
中不需要这样做,但在OS X中需要这样做。我在这个答案中使用
-e
的唯一原因是为了能够终止
r
命令的文件名参数。