小弟在sed使用中,对正则表达式有几个地方犯迷糊,为了彻底弄明白,试验之……
特将结果
呈与各位,请师兄们批评指正!也让初学者少走弯路。
虽说有些问题在明白之后,感觉很简单,贴出来好像没必要;但在明白之前,的确很让人糊涂,所
以还是决定贴出来。
In basic regular expressions the metacharacters ?, +,
{, |, (, and ) lose their special meaning; instead use the backslashed
versions \?, \+, \{, \|, \(, and \).
---以上来自man grep 中的REGULAR
EXPRESSIONS
正则表达式中的限定符:
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及
"zoo"。* 等价于。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+
等价于 。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。?
等价于 。
n是一个非负整数。匹配确定的n次。例如,'o' 不能匹配"Bob"中的'o',但是能匹配"food"中的两个o。
n
是一个非负整数。至少匹配n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。
m 和
n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o" 将匹配 "fooooood" 中的前三个
o。'o' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
\d 匹配一个数字字符。等价于 [0-9]。
\D
匹配一个非数字字符。等价于 [^0-9]。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
PS:linux 9 +sed-4.0.5-1
$
cat text
1*
1+
1?
1.
^1
1$
1{}
1
1
1
1()
1[]
1[a-z]
1[^a-z]
1[a-z$]
1111
222222
1a
1bb
1\
aaa aa aa
boy\gire\people
boy3gire5people
boy4gire9people
x|y
aab|cddd
212
21\
t\w
t\W
y\d
y\D
$
cat text |sed -n '/1*/p'
将显示text所有内容,因为sed能直接识别正则表达式符号 * ,/1*/
意思是与包括1和不包括1的所有行匹配。
$ cat text |sed -n '/1\*/p'
仅显示 1* 这一行, *
在转义之后只是一个普通字符。
$ cat text |sed -n '/1+/p'
仅显示 1+
这行,因为sed并不能直接识别 + ,只是把它当作一个普通字符。
$ cat text |sed -n '/1\+/p'
显
示所有含一个及以上 1 的行, + 在转义后,成为正则表达式。
$ cat text |sed -n '/1?/p'
仅
显示 1? 这行,因为sed并不能直接识别正则表达式符合 ? ,只是把它当作一个普通字符。
$ cat text |sed -n
'/1\?/p'
显示所有的行,/1\?/ 与包括1和不包括1的所有行均匹配。
$ cat text |sed -n
'/1./p'
显示所有含1的行,因为sed能直接识别正则表达式符号“ . ” 。
$ cat text |sed -n
'/1\./p'
仅显示匹配 1. 的这行,“ . ”在转义后仅是一普通字符。
$ cat text |sed -n
'/^1/p'
显示所有以 1 开头的行,因为sed能直接识别正则表达式符合 ^ 。
$ cat text |sed
-n '/\^1/p'
显示 ^1 这一行, ^ 在转义后仅是一普通字符。
$ cat text |sed -n
'/1$/p'
显示所有以 1 结尾的行,因为sed能直接识别正则表达式符号 $ 。
$ cat text |sed
-n '/1$/p'
显示 1$ 这一行, $ 在转义后仅是一普通字符。
$ cat text |sed -n
'/1{}/p'
仅显示 1{} 这一行,因为sed并不能直接识别正则表达式符合{}。
$ cat text |sed -n
'/1/p'
原理同上
$ cat text |sed -n '/1/p'
原理同上
$ cat text
|sed -n '/1/p'
原理同上
$ cat text |sed -n '/1()/p'
原理同上
$
cat text |sed -n '/1\/p'
在转义之后,{} 在sed中具有 正则表达式限定符 功能,故显示两个及以上 1
的行。
$ cat text |sed -n '/1\/p'
原理同上,显示所有含1及不含1 的行。
$ cat
text |sed -n '/1[]/p'
报错“sed: -e expression #1, char 6:
Unterminated address regex”,因为sed能直接识别正则表达式符号 [] ,但 []
中间却为空,没有相关集合(字母或数字),故错。
$ cat text |sed -n '/1\[\]/p'
显示 1[]
这一行, []在转义后仅是普通字符。
$ cat text |sed -n '/1[0-9]/p'
1
1111
不过我不明白为何会跑出第一行?难道是我的机器有毛病???因为/1[0-9]/与中的 “10”匹配!
$ cat
text |sed -n '/1[^0-9]/p'
显示出所有含1 ,并且 1 后面非数字的行。
$ cat text
|sed -n '/boy\gire\people/p'
无显示。因为sed不知道 \g \p 是什么,找不到匹配的东东!
$
cat text |sed -n '/boy\gire\people/p'
显示包含 boy\gire\people
的这一行,第一个\ 把紧随的 \ 转义成普通字符。
$ cat text |sed -n '/boy[0-9]/p'
boy3gire5people
boy4gire9people
但是
$ cat text |sed -n '/boy\d/p'
$
cat text |sed -n '/boy\d\/p'
却都没有显示,\d 不是等价于 [0-9] 。这里为甚么没显示?
\d
\D \w \W 在使用时我还没有找到窍门,还请各位指教!
本人测试后,发现:
\w
在sed中好像只等价于'[A-Za-z_]'
\W 在sed中好像只等价于'[^A-Za-z_]'
\d 在sed中等价于'd'
\D 在sed中等价于'D'
\s 在sed中等价于's'
\S 在sed中等价于'S'
$ cat
text |sed -n '/b|c/p'
显示 aab|cddd 这一行。sed把 | 当作普通字符。
$ cat text
|sed -n '/x|y/p'
显示 x|y 这一行。sed把 | 当作普通字符。
$ cat text |sed
-n '/aab\|212/p'
aab|cddd
212
|在转义之后表示 “或”的功能,对匹配aab 或 212
的行进行显示。
小结:
sed中可直接使用的RE:
* . ^ $ [ ] \ c
\w (
相当于[A-Za-z_] ) \W ( 相当于[^A-Za-z_] )
sed中需转义使用的RE:
+ ? { } ( ) |
< >
其他:
\d (d) \D (D) \s (s) \S (S)
匹配 单引号’ 用双引号
匹
配 反引号` 用单引号
\b 匹配单词的前或后边界 ( 字符[^A-Za-z0-9_]均构成单词边界 )
\B 匹配单词的非边界
( 字符[^A-Za-z0-9_]均构成单词边界 )
\< 匹配单词的位置前 ( 字符[^A-Za-z0-9_]均构成单词边界 )
\> 匹配单词的位置后 ( 字符[^A-Za-z0-9_]均构成单词边界 )
支持十进制,格式为“\d +
两位或三位十进制数”,如“\d065 或\d65 均代表字符 A ”
支持十六进制,格式为“\x + 两位十六进制数”,如“\x61
代表字符 A ”
支持八进制,格式为“\o + 两位或三位八进制数”,如“\o077 或\o77 均代表字符 ?,\o101代表字符 A
”
对于 sed 4.0.5
1. 没有 \D
2. 没有 \d, 只有 \dXXX. 例如
\d097 也就是字符 a
3. \W, \w, \S, \s 没有正常工作, 这是 4.0.5 的 bug# 09022.
可
能在 sed-4.0.7-2 中解决。
分享到:
相关推荐
**sedsed工具详解** `sedsed`工具是基于经典的`sed`命令行工具的扩展,它提供了更方便的功能和增强的用法...熟悉并掌握`sedsed`的用法,能提升Linux环境下的文本处理效率,是Linux系统管理员和开发者的重要工具之一。
在Windows环境下,用户安装`sed-4.2.1-setup.exe`后,可以直接在命令行使用`sed`命令。而在Linux或Unix系统中,通常需要通过包管理器安装`sed`。使用时,用户通常会输入类似`sed 's/old/new/g' input.txt > output....
在Windows环境下,可以编写一个批处理脚本来调用sed-4.2.1-setup.exe安装程序,并配置相应的环境变量,以便于在命令行中直接使用sed命令。 压缩包中的 **sed-4.2.1-setup.exe** 文件是Windows下的可执行文件,负责...
2. **流编辑**:sed能够直接处理来自标准输入的数据流,无需先将其存储到文件中。 3. **易于集成到shell脚本**:由于支持管道操作,sed可以轻松嵌入到复杂的shell脚本中。 4. **自动化的编辑过程**:sed可以通过编写...
你需要将`sed`所在目录添加到系统的`PATH`环境变量中,这样可以在任何位置直接调用`sed`命令。具体操作如下: 1. 找到`sed.exe`的安装路径,例如`C:\Program Files\GnuWin32\bin`。 2. 右键点击“计算机”或“此电脑...
prompt$ sedsed --help usage: sedsed OPTION [-e sedscript] [-f sedscriptfile] [inputfile] OPTIONS: -f, --file add file contents to the commands to be parsed -e, --expression add the script to the ...
在sed的上下文中,一些被错误识别的内容可能实际是想展示sed的命令和用法。比如,应该有诸如`sed 's/原字符串/新字符串/' 文件名`这样的命令,它用于替换文件中的指定字符串。在文档内容的表述中,虽然出现了较多...
正则表达式提供了一种模式匹配语言,可以用来识别和操作符合特定模式的文本。了解并掌握正则表达式的语法和使用,是使用sed和awk进行有效文本处理的关键。 **编写sed和awk脚本的技巧** 编写sed和awk脚本时,从简单...
标题中的"sed.exe win x32 x64"指的是在Windows操作系统中,为32位(x32)和64位(x64)系统提供的sed命令行工具。sed(流编辑器Stream Editor)是一个...正确安装并掌握sed的使用,能极大地提高你在处理文本任务时的效率。
了解并熟练运用SED命令,可以大大提高文本处理的效率,无论是简单的查找替换,还是复杂的文本处理任务,SED都能胜任。在实际使用中,可以结合正则表达式的灵活性,编写出强大的文本处理脚本来满足各种需求。
**1.3 sed能做哪些编辑动作** sed提供了多种编辑功能,包括但不限于: - 替换文本 - 删除行 - 插入文本 - 搜索特定模式 - 更改行 - 复制或移动文本块 这些功能可以通过一系列命令来实现,并且这些命令可以组合...
它允许用户通过一系列预定义的命令来对文本进行操作,无需直接手动编辑文本内容。SED的主要优势在于它能够高效地处理重复性的文本编辑任务,如字符串替换、行的删除和插入等,特别适合于批量处理大型文本文件。 ###...
SED,全称Stream EDitor,是Unix环境下的流编辑器,主要用于对文本进行过滤和转换,支持正则表达式。它以行为单位对文本进行处理,并且可以执行插入、删除、替换以及其它复杂的文本转换操作。SED可以使用单行命令...
虽然不建议这样做,但 `sed` 也支持直接修改输入文件。 示例: ``` sed -i 's/old/new/g' file.txt ``` #### 六、其他 `sed` 命令 ##### 28. 在行后添加 (`a` 命令) `a` 命令可以在匹配行之后添加一行文本。 ...
Sed(Stream EDitor)为 UNIX 系统上提供将编辑工作自动化的编辑器 , 使用者无需直接编辑资料。使用者可 利用 sed 所提供 20 多种不同的函数参数 , 组合(解 [1])它们完成不同的编辑动作。此外 , 由於 sed 都 以...
### sed 参数完全解释 #### 概述 `sed` 是一款功能强大的流编辑器,主要用于在 Linux 或 Unix 系统中进行文本过滤和转换。...无论是简单的替换操作还是复杂的文本筛选,`sed` 都能提供简单且高效的解决方案。