sh/bash/dash/ksh/zsh等Shell脚本
-
needle
- 帖子: 78
- 注册时间: 2009-12-01 13:34
#1
帖子
由 needle » 2014-04-28 21:41
请问[ab]*怎么解释~
挺长时间没写复杂的正则,感觉不怎么熟了~
而且想复习一下,似乎一下想不到去哪看了

myshell^_^
xfce4.10最好用了……
舒适的滚轮升起焦点设计,大量快捷键,alt移动,糟糕的桌面图标……
珍爱生命,
LFS 三思~
-
xcjzhd
- 帖子: 203
- 注册时间: 2009-06-12 20:20
- 系统: The Great ArchLinux
#2
帖子
由 xcjzhd » 2014-04-28 21:43
[ab]表示匹配a或者b, *表示之前匹配[ab] 0次或者一次或者多次. 也就是说, [ab]*可以匹配任意由a和b组成的字符串或者空串.
负责解决各种UEFI问题
-
needle
- 帖子: 78
- 注册时间: 2009-12-01 13:34
#3
帖子
由 needle » 2014-04-29 14:52
哦! 想通了,谢谢!
应该是对正则的匹配规则有点淡忘了:根据正则逐长度的向后匹配。
而且,昨晚想弄一个:
\x替换成0x,遇到\\x则不替换,想用sed的后向引用,结果不对,跟上上行有关,是同一个问题(放弃了,写不出来):
匹配成功后,会跳过匹配成功的长度,而不是仅跳过当前的字符

myshell^_^
xfce4.10最好用了……
舒适的滚轮升起焦点设计,大量快捷键,alt移动,糟糕的桌面图标……
珍爱生命,
LFS 三思~
-
susbarbatus
- 帖子: 2966
- 注册时间: 2010-04-10 16:14
- 系统: Arch Linux
#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¢os6
#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
#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¢os6
#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
#8
帖子
由 susbarbatus » 2014-05-08 11:25
... 例子都一样的啊,任意字符串,反正所有 a\x 都会被直接替换为 a0x,开头的 \x 被替换为 0x,\\x 不变就这样
沉迷将棋中……
-
needle
- 帖子: 78
- 注册时间: 2009-12-01 13:34
#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 三思~