问一个正则的小问题~

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
needle
帖子: 78
注册时间: 2009-12-01 13:34

问一个正则的小问题~

#1

帖子 needle » 2014-04-28 21:41

请问[ab]*怎么解释~
挺长时间没写复杂的正则,感觉不怎么熟了~
而且想复习一下,似乎一下想不到去哪看了 :em20
myshell^_^
xfce4.10最好用了……
舒适的滚轮升起焦点设计,大量快捷键,alt移动,糟糕的桌面图标……
珍爱生命,LFS 三思~
头像
xcjzhd
帖子: 203
注册时间: 2009-06-12 20:20
系统: The Great ArchLinux

Re: 问一个正则的小问题~

#2

帖子 xcjzhd » 2014-04-28 21:43

[ab]表示匹配a或者b, *表示之前匹配[ab] 0次或者一次或者多次. 也就是说, [ab]*可以匹配任意由a和b组成的字符串或者空串.
负责解决各种UEFI问题
头像
needle
帖子: 78
注册时间: 2009-12-01 13:34

Re: 问一个正则的小问题~

#3

帖子 needle » 2014-04-29 14:52

哦! 想通了,谢谢!
应该是对正则的匹配规则有点淡忘了:根据正则逐长度的向后匹配。
而且,昨晚想弄一个:
\x替换成0x,遇到\\x则不替换,想用sed的后向引用,结果不对,跟上上行有关,是同一个问题(放弃了,写不出来):
匹配成功后,会跳过匹配成功的长度,而不是仅跳过当前的字符
:em22
myshell^_^
xfce4.10最好用了……
舒适的滚轮升起焦点设计,大量快捷键,alt移动,糟糕的桌面图标……
珍爱生命,LFS 三思~
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: 问一个正则的小问题~

#4

帖子 susbarbatus » 2014-04-29 18:20

代码: 全选

~> echo '\x1\x\\x' | sed -r 's/(^|[^\\])\\x/\10x/g'
0x10x\\x
沉迷将棋中……
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: 问一个正则的小问题~

#5

帖子 糊涂的小强 » 2014-05-07 17:53

susbarbatus 写了:

代码: 全选

~> echo '\x1\x\\x' | sed -r 's/(^|[^\\])\\x/\10x/g'
0x10x\\x
看的眼花缭乱,能逐步解释下吗,在sed 's/要替换的字符串/新的字符串/g' 的框架下
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: 问一个正则的小问题~

#6

帖子 susbarbatus » 2014-05-07 19:36

要替换的字符串:
( => 开始一个组
^ => 行首
| => 或
[^ => 匹配与指定的字符不同的任意字符
\\ => 转义,字符 \
] => 结束 [
) => 结束 (
\\x 转义,\x
合起来就是匹配所有位于行首(不存在前一个字符)或前一个字符不是 \ 的 \x。
这里前一个字符也会被匹配到,例: \x12\x\\x 匹配到的是红色部分 \x12\x\\x

新的字符串:
\1 => 第一个组的内容,也就是前面那个( )里的内容, \x 的前一个字符,如果是行首则为空。
0x => 0x
所以前面的例子,红色是匹配到的和替换后的内容。
\x12\x\\x => 0x120x\\x
沉迷将棋中……
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: 问一个正则的小问题~

#7

帖子 糊涂的小强 » 2014-05-08 10:27

susbarbatus 写了:要替换的字符串:
( => 开始一个组
^ => 行首
| => 或
[^ => 匹配与指定的字符不同的任意字符
\\ => 转义,字符 \
] => 结束 [
) => 结束 (
\\x 转义,\x
合起来就是匹配所有位于行首(不存在前一个字符)或前一个字符不是 \ 的 \x。
这里前一个字符也会被匹配到,例: \x12\x\\x 匹配到的是红色部分 \x12\x\\x

新的字符串:
\1 => 第一个组的内容,也就是前面那个( )里的内容, \x 的前一个字符,如果是行首则为空。
0x => 0x
所以前面的例子,红色是匹配到的和替换后的内容。
\x12\x\\x => 0x120x\\x
嗯 小香猪 能举个2组以上的例子吗
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: 问一个正则的小问题~

#8

帖子 susbarbatus » 2014-05-08 11:25

... 例子都一样的啊,任意字符串,反正所有 a\x 都会被直接替换为 a0x,开头的 \x 被替换为 0x,\\x 不变就这样
沉迷将棋中……
头像
needle
帖子: 78
注册时间: 2009-12-01 13:34

Re: 问一个正则的小问题~

#9

帖子 needle » 2014-08-02 3:31

susbarbatus 写了:

代码: 全选

~> echo '\x1\x\\x' | sed -r 's/(^|[^\\])\\x/\10x/g'
0x10x\\x
唉呀呀,竟然写出来啦!佩服!
那个时间点,我在干什么:
nmap扫描结果(扫描win时)输出汉字时,会以utf8序列形式呈现,
所以我突然想写个转换脚本,而遇到了你已解决的这个问题。

后来,脚本是写出来了,不过这个问题有没有解决,我给忘了,
反正最后能用了就不改啦!
哈哈,谢谢!
myshell^_^
xfce4.10最好用了……
舒适的滚轮升起焦点设计,大量快捷键,alt移动,糟糕的桌面图标……
珍爱生命,LFS 三思~
回复