簡體   English   中英

Unix sed命令正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM