请教:tail 提取文本文件的内容,用sed替换时出错?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

请教:tail 提取文本文件的内容,用sed替换时出错?

#1

帖子 TeliuTe » 2016-06-12 11:45

用for读出来的替换另一个html文件里的@@没问题,(参看附件样例)
用tail提取的就提示 sed: -e 表达式 #1, 字符 56: 未终止的“s”命令,用leafpad查看提取的内容,结尾多了一空行

for 的可以正常通过

代码: 全选

#!/bin/bash
#8.txt里有5行数据,第1行不要
i=1
for yyyy in `cat 8.txt`;do

if ((i !=1));then
b=$b"$yyyy";
fi
((i=i+1))

done

find -name 'lesson.html' -exec sed -i 's;@@;'$b';' {} \; 
tail 出错的

代码: 全选

#!/bin/bash
line=`sed -n '$=' 8.txt`
((line=line-1))
b=`cat 8.txt | tail -n $line`

find -name 'lesson.html' -exec sed -i 's;@@;'$b';' {} \; 
附件
test.7z
样例文件:把8.txt里的后面4行插入到lesson.html的@@位置处
(613 Bytes) 已下载 161 次
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 请教:tail 提取文本文件的内容,用sed替换时出错?

#2

帖子 cao627 » 2016-06-12 12:45

代码: 全选

czj@debian:~/Downloads$ d="1.打开主文件夹,点右键新建文件夹。 2.打开8-3,最上面找书签菜单。 3.左侧栏找绿色表格,打开。 4.保存是绿色的,存到8-3里。"
czj@debian:~/Downloads$ echo $d
1.打开主文件夹,点右键新建文件夹。 2.打开8-3,最上面找书签菜单。 3.左侧栏找绿色表格,打开。 4.保存是绿色的,存到8-3里。
czj@debian:~/Downloads$ echo "$d"
1.打开主文件夹,点右键新建文件夹。 2.打开8-3,最上面找书签菜单。 3.左侧栏找绿色表格,打开。 4.保存是绿色的,存到8-3里。



czj@debian:~/Downloads$ c="1.打开主文件夹,点右键新建文件夹。
> 2.打开8-3,最上面找书签菜单。
> 3.左侧栏找绿色表格,打开。
> 4.保存是绿色的,存到8-3里。
> "
czj@debian:~/Downloads$ echo $c
1.打开主文件夹,点右键新建文件夹。 2.打开8-3,最上面找书签菜单。 3.左侧栏找绿色表格,打开。 4.保存是绿色的,存到8-3里。
czj@debian:~/Downloads$ echo "$c"
1.打开主文件夹,点右键新建文件夹。
2.打开8-3,最上面找书签菜单。
3.左侧栏找绿色表格,打开。
4.保存是绿色的,存到8-3里。

如上,d和c变量用echo $d 和 echo $c命令显示是一样的。但echo "$d" 和 echo "$c" 显示不一样。
即你的 b=`cat 8.txt | tail -n 4` 命令给b赋值的结果相当与如上变量c的值,其中包含不可见换行符号。
sed 's;@@;'$b';' lesson.html 命令执行时变量$b中的不可见换行符,你不可见,但sed命令可见
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: 请教:tail 提取文本文件的内容,用sed替换时出错?

#3

帖子 TeliuTe » 2016-06-13 17:56

多谢解答,
貌似用tail还不行,for有点太啰嗦,我再试试看
头像
astolia
论坛版主
帖子: 6420
注册时间: 2008-09-18 13:11

Re: 请教:tail 提取文本文件的内容,用sed替换时出错?

#4

帖子 astolia » 2016-06-13 22:48

如果能保证@@独占一行的话

代码: 全选

sed '1d' 8.txt > /tmp/tmpfile
sed -i -e '/@@/{r /tmp/tmpfile' -e 'd}' lesson.html
或者干脆用perl,最简单

代码: 全选

perl -i -pe 's/@@/`sed '1d' 8.txt`/ge' lesson.html
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: 请教:tail 提取文本文件的内容,用sed替换时出错?

#5

帖子 TeliuTe » 2016-06-14 13:02

@@ 要替换成网页标题,段落标题和正文内容,前面两个不能单独一行
--
暂存一下,

代码: 全选

rpl -Rde '\r\n'  '<br />\r\n'  ./*.txt
所有的文本文件的换行加上html换行符

sed -i -e '/@bb/{r 8__.txt' -e 'd}' lesson.html
把整个文本文件插入到模板中,@bb独占一行

b=`echo $a |cut -d ' ' -f 2`
按空格分割,取空格后面的字符串,比如“第一课 学会Ubuntu”,取出后面的“学会Ubuntu”加到标题里,在添加<br/>之前,先取出来
前面的一对``表示括起来的是一句命令,cut 分割,-d 按指定字符,单引号里有个空格,f 2 指定留下空格分割的第二段
头像
astolia
论坛版主
帖子: 6420
注册时间: 2008-09-18 13:11

Re: 请教:tail 提取文本文件的内容,用sed替换时出错?

#6

帖子 astolia » 2016-06-14 17:00

TeliuTe 写了:@@ 要替换成网页标题,段落标题和正文内容,前面两个不能单独一行
我指的是@@这两个字符需要独占一行,sed脚本里就可以直接用d命令删除整行了。而不是替换后的内容
回复