Board logo

标题: sed 提取文档内容 [打印本页]

作者: 26933062     时间: 2007-6-25 21:00    标题: sed 提取文档内容

a.txt内容如下
dslfj
@aaa\张三\kjj\工商局\sdf\局长\sdfj
\李四\dfj\物资局\sdkfj\科长\
@dsf\王三军\sdkfj\税务局\dslfj\副局长\
jsdf
特点:汉字全在\\内  (如果因\是特殊符号,可以换成其它的符号)
要求用sed命令 只处理 @ 符号开头的行,到下一个以 @ 符号开头的行结束
得到如下结果,注意:有空行
工商局
局长  张三

物资局
科长   李四

税务局
副局长  王三军

如果不行,得到这个结果也可以
工商局局长  张三
物资局科长  李四
税务局副局长  王三军
作者: lxmxn     时间: 2007-6-25 21:25

sed -n "/^@/,/^@/!d;s/.*\\\(.*\)\\.*\\\(.*\)\\.*\\\(.*\)\\.*/\2\n\3 \1\n/p" a.txt

作者: 26933062     时间: 2007-6-25 22:15
真牛!!!
还有几个问题想请教 版主 一下
1,sed 处理文档 和文档的大小有关吗?好像从别处看到说处理大的文档时要注意,注意什么?是会出错吗?
2,那么批处理处理文档和大小有关吗?
作者: 26933062     时间: 2007-6-25 22:22
代码好长,请问可以向批处理一样分行写吗?
我是写在批处理中的.
作者: lxmxn     时间: 2007-6-25 22:37
sed 又名行编辑器,即一行行的来处理文本的,所以不用担心文件过大而出错。

不能直接在批处理分行写,否则报错。

如果你要将各个命令分行,可以写个sed脚本,用sed命令来调用。

比如上面的
sed -n -f a.sed a.txt
a.sed 的内容:

  Quote:
/^@/,/^@/!d
s/.*\\\(.*\)\\.*\\\(.*\)\\.*\\\(.*\)\\.*/\2\n\3 \1\n/p


作者: vkill     时间: 2007-6-25 22:51


  Quote:
Originally posted by lxmxn at 2007-6-25 22:37:
sed 又名行编辑器,即一行行的来处理文本的,所以不用担心文件过大而出错。

单行超过2048个字符还是会出错的,没有记错的话
作者: 26933062     时间: 2007-6-25 23:07
多谢,又学习了.
作者: 26933062     时间: 2007-6-25 23:16
sed脚本里面是不是只要写 引号内的内容就可以了,
我写了个 删除所有符号的脚本,怎么不能运行呢?
内容
s/,/ /g;s/(/ /g;s/)/ /g;s$;$ $g;s/\:/ /g;s/\./ /g;s/?/ /g;s/-//g;s/ / /g
s/,/ /g;s/;/ /g;s/(/ /g;s/)/ /g;s/。/ /g;s/:/ /g;s/、/ /g
s/女/ /g;s$/$ $g;s/#/ /g
用下面的调用的
sed -n -f a.sed aaa.txt | more>bbb.txt
作者: lxmxn     时间: 2007-6-26 00:19

sed -f a.sed aaa.txt | more>bbb.txt

作者: 26933062     时间: 2007-6-26 03:45
晚上好 lxmxn 又来打搅您了
还是上面的要求,有一点改变
要求: 将==内的占一行,--号内的另起一行,\\内的加一个空格,放在--号内的内容的后面,再加一空行,也就是输出结果同上面一样,
dslfj
@aaa\张三\kjj=工商局=sdf-局长-sdfj
\李四\dfjsdkfj-科长-fg=物资局=
@sdkfj=税务局=dslfj-副局长-dsf\王三军\
jsdf

作者: lxmxn     时间: 2007-6-26 06:55
这个你自己写一下吧。

总依赖别人不是好事。
作者: 26933062     时间: 2007-6-26 13:43
s/.*\@\(.*\)\@.*\@\(.*\)\@.*\@\(.*\)\@.*/\2\n\3 \1\n/p

原来是这样,用  \(.*\)\  定义区域

[ Last edited by 26933062 on 2007-6-27 at 03:39 AM ]
作者: lxmxn     时间: 2007-6-27 21:28    标题: Re 10楼

又学习了一下sed,写的比较粗糙。

  Quote:
sed -n "/@/,/@/{!d;H;s/.*=\(.*\)=.*/\1/p;G;s/.*-\(.*\)-.*$/#\1/p;G;s/.*\\\(.*\)\\.*/\1\n/p;}" a.txt|sed "/^#/{s/#//;N;s/\n/ /}"

[ Last edited by lxmxn on 2007-6-27 at 09:30 PM ]