![使用 sed 替换包含换行符的内容](https://linux22.com/image/109801/%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E5%8C%85%E5%90%AB%E6%8D%A2%E8%A1%8C%E7%AC%A6%E7%9A%84%E5%86%85%E5%AE%B9.png)
我有 markdown README 文件,其中有这样的 html 标记:
<!-- CONTRIBUTORS-START -->
<!-- CONTRIBUTORS-END -->
我想用带有 html 标签和换行符的文件中的新内容替换里面的文本(它可能已经有东西了)(它是单元格中带有 html 的 markdown 表)。
我试图将 sed 中的换行符替换为 0xFF ,然后使用以下代码将其替换回来:
CONTRIBUTORS=`./contributors -u jcubic -r jquery.terminal -m | tr '\n' $'\xFF'`
# contributors script get data from github and display markdown table
# or ERROR if rate limit reached
echo "$CONTRIBUTORS" | grep ERROR > /dev/null || cat README.in | tr '\n' $'\xFF' | \
sed -e "s%\(<!-- CONTRIBUTORS-START -->\).*\(<!-- CONTRIBUTORS-END -->\)%\1\n${CONTRIBUTORS}\2%" #| tr $'\xFF' '\n'
但这不起作用,如何用贡献者内容替换标记内的文本?
当我使用时它有点工作tr '\n' '\xFF'
,但它正在用 替换换行符x
。
我找到了这篇文章Sed:两种模式之间的多行替换并尝试使用:
sed -n "/CONTRIBUTORS-START/{p;:a;N;/CONTRIBUTORS-END/!ba;s%.*\n%${CONTRIBUTORS}\n%};p"
(我已在 s 命令中将 / 替换为 % )但出现错误:
sed: -e expression #1, char 1630: unterminated `s' command
答案1
我使用了这个 hack,我只是将新行转换为笑脸 Unicode 字符"☺"
,同时进行 sed 替换,因为换行符引起了问题。
CONTRIBUTORS=`./contributors -u jcubic -r jquery.terminal -m $@ | tr '\n' '☺'`
if echo "$CONTRIBUTORS" | grep ERROR > /dev/null; then
echo "$CONTRIBUTORS" | tr '☺' '\n'
else
cat README.in | sed -n "/CONTRIBUTORS-START/{p;:a;N;/CONTRIBUTORS-END/!ba;s%.*\n%${CONTRIBUTORS}%};p" | tr '☺' '\n' > README.tmp
cp README.tmp README.in
rm README.tmp
fi