正则表达式匹配行首的问题

sh/bash/dash/ksh/zsh等Shell脚本
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

正则表达式匹配行首的问题

#1

帖子 pangding » 2011-04-30 17:58

要想匹配位于行首的 cat
显然要用 ^cat

现在需要匹配所有不位于行首的 cat 应该用什么表达式?可以用 extended RE.
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

Re: 正则表达式匹配行首的问题

#2

帖子 fnan » 2011-04-30 21:56

grep -v '^cat' a
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: 正则表达式匹配行首的问题

#3

帖子 aerofox » 2011-04-30 21:58

不位于行首,则前面至少有一个字符,所以可以用“.cat”

代码: 全选

grep '.cat'
上次由 aerofox 在 2011-04-30 22:04,总共编辑 1 次。
头像
remeber
论坛版主
帖子: 13005
注册时间: 2009-01-06 15:18
来自: 人间
送出感谢: 1 次
接收感谢: 22 次

Re: 正则表达式匹配行首的问题

#4

帖子 remeber » 2011-04-30 22:01

-v 反选
“有一种被人抛诸脑后的过去,包含一些不该遗忘的点点滴滴。欢笑之余,我将故旧拾起,才刹见自己的薄情。人世间似乎存在着某种公平,每个人都曾被抛掷在他人的遗忘中;而今你所有哽咽难宣的话语,也正是你曾为人所期盼,却永远听不见的字句。” —赫曼 赫塞
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

Re: 正则表达式匹配行首的问题

#5

帖子 pangding » 2011-04-30 23:32

要是能用 -v 的话就好了。

我就是想问有没有正则表达式能描述这个意思。
因为在匹配一种語法文件的时候,有一个关键字不能在行首,所以要专门去掉这种情况。
如果能的话,脚本就会写的比较容易。不然就得用非常迂回的手法。渲染这种語法很常用,所以我想写的清楚些。
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

Re: 正则表达式匹配行首的问题

#6

帖子 pangding » 2011-04-30 23:35

我看三楼的方法行。用用试试。
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

Re: 正则表达式匹配行首的问题

#7

帖子 fnan » 2011-05-01 18:46

pangding 写了:我看三楼的方法行。用用试试。
真的不行:

代码: 全选

kose5@kose5-Aspire-4552:~$ cat a
cat dsf dsdf
df cat fgfg cat
(#为了显示空格) cat
12cat
cat nm cat
cat bncat
ccat
asd dsf
kose5@kose5-Aspire-4552:~$ grep '.cat' a
df cat fgfg cat
(#为了显示空格) cat
12cat
cat nm cat
cat bncat
ccat
上次由 fnan 在 2011-05-01 19:15,总共编辑 2 次。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

Re: 正则表达式匹配行首的问题

#8

帖子 fnan » 2011-05-01 18:55

pangding 写了:要是能用 -v 的话就好了。

我就是想问有没有正则表达式能描述这个意思。
因为在匹配一种語法文件的时候,有一个关键字不能在行首,所以要专门去掉这种情况。
如果能的话,脚本就会写的比较容易。不然就得用非常迂回的手法。渲染这种語法很常用,所以我想写的清楚些。
怎么不早说不要行首符号,不能用awk?:
kose5@kose5-Aspire-4552:~$ cat a
cat dsf dsdf
df cat fgfg cat
(#为了显示空格) cat
12cat
cat nm cat
cat bncat
ccat
asd dsf
kose5@kose5-Aspire-4552:~$ awk -F"cat" '{if ($1 != "" && NF > 1) print $0}' a
df cat fgfg cat
(#为了显示空格) cat
12cat
ccat
kose5@kose5-Aspire-4552:~$
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

Re: 正则表达式匹配行首的问题

#9

帖子 pangding » 2011-05-01 19:31

谢谢 fnan 的耐心解答。

不过 .cat 其实就差不多了。
我后来发现把那个关键词看成 " cat\b" 基本就行。(\b 是 perl 里的 word boundary,我用的不是 perl 但也支持类似的表达)。就是 cat 是一个完整的单词,不能是 catxxx 也不能是 xxxcat。

现在没发现什么明显的 bug,这么写有什么问题?
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

Re: 正则表达式匹配行首的问题

#10

帖子 pangding » 2011-05-01 19:34

用什么都行 awk 也可以。

cat xxxx cat xxxx
这种行也要,因为它含一个合法的 cat。
fnan
帖子: 919
注册时间: 2009-07-01 22:04
送出感谢: 0
接收感谢: 13 次

Re: 正则表达式匹配行首的问题

#11

帖子 fnan » 2011-05-02 20:51

pangding 写了:谢谢 fnan 的耐心解答。

不过 .cat 其实就差不多了。
我后来发现把那个关键词看成 " cat\b" 基本就行。(\b 是 perl 里的 word boundary,我用的不是 perl 但也支持类似的表达)。就是 cat 是一个完整的单词,不能是 catxxx 也不能是 xxxcat。

现在没发现什么明显的 bug,这么写有什么问题?
问题不是怎样写,而是才发现猜问题比脚本本身更有挑战性。
这么说完整问题是: 有单词cat,不是单独在行首?还是根本与行首无关,有单词cat就行?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

Re: 正则表达式匹配行首的问题

#12

帖子 pangding » 2011-05-03 13:17

看来我一开始说的不清楚。

是要找所有的 单词 cat,但是如果这个单词出现在行首,则不认为它是要找的。

像我举例的
cat xxxx cat xxxx
其中第一个就不合法,但第二个是对的。
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

Re: 正则表达式匹配行首的问题

#13

帖子 pangding » 2011-05-03 13:27

只不过这里的 cat 要是单词,就是不能是 catxxx 或者 xxxcat 或者 xxxcatxxx。

其实在三楼提示了点以后,我已经能用 perl 描述这个表达式了。

在 vi 里应该可以用类似
/.\zs\<cat\>/
的表达式表达。

\zs 用来描述匹配从这开始。即前面的 . 只是为了向后检查。有点类似 perl 里的 (?<=pattern),表示这个匹配前面至少有一个字符,因而不在行首。
\< 和 \> 在 vi 里表示单词边界。

不过大家有兴趣也可以试试别的方法。不过不是所有的正则引擎的这么给力的。不一定能描述出来。
上次由 pangding 在 2011-05-03 13:44,总共编辑 2 次。
pangding
帖子: 48
注册时间: 2011-03-01 23:14
送出感谢: 5 次
接收感谢: 0

Re: 正则表达式匹配行首的问题

#14

帖子 pangding » 2011-05-03 13:35

现在可以放宽条件,用 -v 或者 管道 都可以。awk 呀 sed 都可以用。
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 正则表达式匹配行首的问题

#15

帖子 lilydjwg » 2011-05-03 13:44

pangding 写了:现在可以放宽条件,用 -v 或者 管道 都可以。awk 呀 sed 都可以用。

代码: 全选

grep -oP '(?!^)\bcat\b'
回复

回到 “Shell脚本”