sed笔记231127 `-e`基本正则,`-E`扩展版正则

90 阅读7分钟

-e基本正则,-E扩展版正则

  • -E, -r, --regexp-extended 在脚本中使用扩展正则表达式(为保证可移植性使用 POSIX -E)。
  • -e--expression 接基本正则表达式, 可多次使用,多次过滤
  • -f--file 选项接脚本文件, 注意是脚本文件, 而不是输入文件

-e可以不写, 如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为 sed脚本。

其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准 输入读取数据。

和grep一样找出文本文件中的匹配行

默认都是普通版正则

# p要与-n连用, 不知为社么
sed -n /pattern/p x.txt
# ↑功能等效↓
sed -ne /pattern/p x.txt
# ↑功能等效↓
grep pattern x.txt
# ↑功能等效↓
cat x.txt | sed -n /pattern/p
# ↑功能等效↓
cat x.txt | sed -ne /pattern/p
# ↑功能等效↓
cat x.txt | grep pattern

扩展版正则

# p要与-n连用, 不知为社么
sed -nE /pattern/p x.txt
# ↑功能等效↓
grep -E pattern x.txt
# ↑功能等效↓
cat x.txt | sed -nE /pattern/p
# ↑功能等效↓
cat x.txt | grep -E pattern

sed查找替换

# 源文件不会被替换, 只输出的内容被替换
# g是整个文档, i是忽略大小写
sed "s/基本正则/替换内容/gi" x.txt
或
sed -e "s/基本正则/替换内容/gi" x.txt
或
sed -E "s/扩展正则/替换内容/gi" x.txt

基本正则和扩展正则

  • sed     默认或-e, --expression sh使用基本版正则

  • grep   默认或-e,        --regexp 启用扩展版正则


  • sed     用-E, -r, --regexp-extended 启用扩展版正则

  • grep   用-E,        --extended-regexp 启用扩展版正则

在基本正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。

在扩展正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。

在基本正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。

在扩展正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。

在扩展正则表达式中:

( ) 表示分组

(ab) 表示将ab当做一个整体去处理。

\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。

\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。

? 表示匹配其前面的字符0或1次

  • 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。

{n} 表示前面的字符连续出现n次,将会被匹配到。

{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。

{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。

{n,}表示之前的字符连续出现至少n次,才会被匹配到。

看了上述总结以后,是不是已经想要放弃使用”基本正则表达式”了呢?因为与之相比,扩展正则表达式才更符合我们这些懒人的习惯,而且,扩展正则表达式的可读性也更高,毕竟很多符号少了前面的”\”,可读性就变强了。

扩展正则表达式中,还有一个常用的符号,是基本正则表达式中所没有的,它就是”|”

基本版正则

grep -e 'hello\|nihao' x.txt

扩展版正则

grep -E 'hello|nihao' x.txt

基本正则表达式和扩展正则表达式有什么区别

基本正则表达式(Basic Regular Expression,BRE)和扩展正则表达式(Extended Regular Expression,ERE)主要在以下几个方面存在区别:

  1. 字符集:在基本正则表达式中,一些字符具有特殊的含义,比如.、*、^、[]\等。如果想在正则表达式中使用这些字符的字面含义,必须使用转义符号。而在扩展正则表达式中,除了.、[ ]、\等。如果想在正则表达式中使用这些字符的字面含义,必须使用转义符号。而在扩展正则表达式中,除了.、*、^、、[ ]、\外,像 ( ) + ? | { } 这些字符也具有特殊的含义,如果想使用这些字符的字面含义,同样需要使用转义符号。

  2. 元字符的转义:在基本正则表达式中,要匹配任何有特殊含义的字符,必须使用反斜杠(\)进行转义。而在扩展正则表达式中,不需要使用反斜杠转义元字符。

  3. 重复符:在基本正则表达式中,重复操作符(如 *、+、?)只能匹配前面的子表达式零次或多次。在扩展正则表达式中,除了可以匹配零次或多次外,还可以匹配一次或多次(使用 +),以及零次或一次(使用 ?)。

  4. 选择结构:在基本正则表达式中,不能直接使用类似 a|b 的结构来表示匹配 a 或 b。而在扩展正则表达式中,可以直接使用这种选择结构。

  5. 括号:在基本正则表达式中,括号被用来分组。在扩展正则表达式中,括号被用来做更复杂的组和限定符。

  6. 其他特性:扩展正则表达式还支持前向肯定查找和后向否定查找等高级特性,而基本正则表达式不支持这些特性。



怎样用sed来给指定字段左右添加括号

sed 's/字段名/(&)/g' 文件名

在上面的命令中,将"字段名"替换为你要添加括号的字段,将"文件名"替换为你要操作的文件的名称。

这个命令将找到文件中所有出现的"字段名",然后在它们的前面添加左括号"(",在它们的后面添加右括号")",实现左右添加括号的效果。

请注意,这个命令会在整个文件中进行替换操作。如果你只想在特定的行中添加括号,可以结合使用sed命令的行操作符来实现。

例如,如果你想在每行的第5个字段前后添加括号,可以使用以下命令:

sed 's/\([^ ]*\) 字段名/\1 (&)/g' 文件名

在PowerShell中,你可以使用字符串替换功能来给指定字段左右添加括号。下面是一个示例:

$text = "这是一个示例字段"  
$newText = $text -replace "字段", "($&)"  
Write-Host $newText

在上面的示例中,我们定义了一个变量$text,其中包含待处理的字符串。然后,我们使用-replace操作符对字符串进行替换。"字段"是要替换的指定字段,"($&)"是替换后的结果,其中$&表示匹配到的字段。最后,我们使用Write-Host命令输出结果。

当你运行这段代码时,它会在指定的字段左右添加括号。例如,输出将会是"这是一个示例(字段)"。你可以根据需要将$text替换为你实际要处理的字符串,并根据需要修改字段的名称和替换后的结果。

请注意,PowerShell中的字符串替换功能非常强大,你可以使用正则表达式进行更复杂的替换操作。如果你需要进行更高级的字段处理,建议查阅PowerShell的相关文档以了解更多关于字符串处理和正则表达式的用法。

sed 中的 & 号

& 在 sed 中有特殊的含义,它代表整个匹配到的字符串。如果你在替换操作中使用 &,那么它会被替换成匹配到的字符串。例如,sed 's/foo/bar&/' 将会把所有出现的 "foo" 替换为 "barfoo",而不是仅仅替换为 "bar"。

在sed命令中,&符号通常用来表示匹配到的文本。它可以在替换操作中使用,表示将匹配到的文本原封不动地插入到替换后的位置。

echo "I have an apple." | sed 's/apple/苹&果/'

输出将是:

I have an 苹apple果.

在替换操作中,&符号将被替换为匹配到的文本,即"apple"。因此,上述命令将"apple"替换为"苹apple果",并将结果输出到标准输出。

需要注意的是,&符号只有在替换操作中才有特殊含义,在其他情况下它只是一个普通字符。如果要在正则表达式中使用&符号本身,需要进行转义,例如使用"&"来表示。