Board logo

标题: [问题求助] 如何用sed提取每行第一对引号中的内容? [打印本页]

作者: 随风    时间: 2011-6-1 18:23     标题: 如何用sed提取每行第一对引号中的内容?

如何用sed提取每行第一对引号中的内容

"aaaaaaaaaaaaaaaaaaaaa"ddddddddddddddddddd"dddddddd"
"dkfdsfiadfafadfjadf"dfa>dfiadfdf"
dkfjiadfafja'f"difjdsifjadsfadsf"fidsjfdasfadsf"1111111"f
"dfijdifjdifjdifdsfidfij"

作者: 随风    时间: 2011-6-1 19:03

tmplinshi 的代码
  1. sed -n "s/[^\"]*\"//;s/\".*//p" tem.txt
复制代码

作者: Batcher    时间: 2011-6-1 19:47

  1. sed "s/^[^\"]*\"\([^\"]*\)\".*/\1/" 1.txt
复制代码

作者: Batcher    时间: 2011-6-1 20:21

  1. gawk -F\" "{print $2}" 1.txt
复制代码

作者: 随风    时间: 2011-6-1 22:01

sed "s/^[^\"]*\"\([^\"]*\)\".*/\1/" 1.txt
上面是batcher的代码
我是这样理解
先把代码用空格隔开
/^  [^\"]  *  \"  \([^\"]*\)  \".*/ \1/
1、 ^号 代表行开头
2、 [^\"] 代表非引号
3、 * 代表 重复0或N次左边的非引号字符
4、 \" 到引号止
5、 \([^\"]*\) 这部分就应该是后面的 \1 了,也是非引号字符
6、 \".* 到引号止,后面.*代表任意字符

不理解的是为什么非要开头的1和2
我这样就不行 sed "s/.*\"\([^\"]*\)\".*/\1/" a.txt
.*\" 前面任意字符到引号止
\([^\"]*\) 和上面的一样
\".* 同上

望batcher能讲解下。。
作者: Batcher    时间: 2011-6-2 00:15

5# 随风


是正则表达式的贪婪性造成的,参考:
http://bbs.bathome.net/thread-12622-1-1.html




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2