unix sed命令正则表达式

Gre*_*een 1 regex unix command sed

谁能解释一下正则表达式在sed substitute命令中是如何工作的.

$ cat path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

$ sed 's/\(\/[^:]*\).**/\1/g' path.txt
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin
Run Code Online (Sandbox Code Playgroud)

从上面的sed命令,他们使用了返回引用和保存运算符的概念.任何人都可以解释一下正则表达式特别是/ [^:]*如何在substitute命令中工作以获得每行中的第一个路径.

fed*_*qui 5

我想你*在你的sed代码中写了一个额外的星号,所以它应该是这样的:

$ sed 's/\(\/[^:]*\).*/\1/g' file
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin
Run Code Online (Sandbox Code Playgroud)

更改分隔符将有助于更好地理解它:

sed 's#\(/[^:]*\).*#\1#g'
Run Code Online (Sandbox Code Playgroud)

s#something#otherthing#g是一个基本sed命令,可以查找something并更改otherthing整个文件.

如果你这样做,s#(something)#\1#g那么你"保存"那个something,然后你可以打印回来\1.

因此,它正在做的是获得一个类似的模式/[^:]*,然后打印回来./[^:]*手段/ and then every char except :.所以它会得到/+所有的字符串,直到它找到一个分号:.它将存储该字符串,然后将其打印回来.

小例子:

# get every char
$ echo "hello123bye" | sed 's#\([a-z]*\).*#\1#g'
hello

# get everything until it finds the number 3
$ echo "hello123bye" | sed 's#\([^3]*\).*#\1#g'
hello12
Run Code Online (Sandbox Code Playgroud)