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命令中工作以获得每行中的第一个路径.
我想你*在你的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)