[英]unix sed command regular expression
任何人都可以向我解釋sed替代命令中的正則表達式如何工作。
$ 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
從上面的sed命令中,他們使用了反向引用並保存了運算符的概念。 誰能向我解釋正則表達式,尤其是/ [^:] *是如何在替代命令中工作的,以便僅獲取每一行的第一個路徑。
我認為您在sed代碼中寫了一個額外的星號*
,因此應該像這樣:
$ sed 's/\(\/[^:]*\).*/\1/g' file
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin
更改定界符將有助於更好地理解它:
sed 's#\(/[^:]*\).*#\1#g'
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
[^:]*
regex中的匹配將匹配除:
以外的所有字符,因此它將一直匹配到:
/usr/kbos/bin
也可以匹配這些
/usr/local/bin
/usr/jbin
/usr/bin
/usr/sas/bin
因為,這些都包含字符,但不是:
.*
匹配任何字符,零次或多次。
因此,此正則表達式[^:]*.*
將匹配所有這些表達式:
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/jbin:/usr/bin:/usr/sas/bin
/usr/bin:/usr/sas/bin
但是,由於正則表達式輸出找到的最長匹配項,因此您僅獲得第一個字段(即,通過使用sed
反向引用來獲取/usr/kbos/bin
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.