我的問題一個字符串的結尾是安靜簡單,但我想我錯過了什麼地方,SED提取與正則表達式
我想提取以下字符串的路徑:「RM -rf/tmp目錄/富/ tmp目錄/條」
我已經試過:
echo "rm -rf /tmp/foo" | sed 's/rm (-[A-Za-z]*)*\(.*\)/\1/'
我期待的結果:
/tmp/foo
我在AIX和我不沒有GNU擴展選項
謝謝
我的問題一個字符串的結尾是安靜簡單,但我想我錯過了什麼地方,SED提取與正則表達式
我想提取以下字符串的路徑:「RM -rf/tmp目錄/富/ tmp目錄/條」
我已經試過:
echo "rm -rf /tmp/foo" | sed 's/rm (-[A-Za-z]*)*\(.*\)/\1/'
我期待的結果:
/tmp/foo
我在AIX和我不沒有GNU擴展選項
謝謝
如果您需要一些安全性和/或容差
YourSource \
| sed 's#^[[:blank:]]*rm\([[:blank:]]\{1,\}-[[:alpha:]]\{1,\}\)*[[:blank:]]\{1,\}/#/#
t
s/^/#/'
假設:
/
開始路徑之前(例如:在-e
參數)/
開始(好像它是/tmp
文件夾,所以沒關係)
/#/#
\([^$[:cntrl:]]-[:blank:]]\)#\2#
增加安全性:
#
因爲具有rm -fr
字符串的工作是非常危險的,當事情有點(如在這種情況下文件名與空間)您需要轉義paranthesis。
echo "rm -rf /tmp/foo" | sed 's/rm \(-[A-Za-z]* \)*\(.*\)/\2/'
在BRE,如果你不逃paranthesis,它會像對待(
,)
爲文字符號。
http://ideone.com/3VI4pG –
完美的作品,感謝您的解釋 – pops
echo "rm -rf /tmp/foo" | sed -r 's/rm (-[A-Za-z]*)*(.*)/\2/'
你有兩個比賽組,首先將匹配-rf
,二是/tmp/foo
有雙向兩個更新你的命令, 刪除第一個比賽組
或 變化\1
到\2
非常感謝這個完整的答案!我正在尋找匹配一個真正的路徑,所以它可以只是一個文件名或真正的路徑,如/ bar/foo/abc/.../...如果第一個替換沒有完成,添加#的想法是完美的對於我的情況,我正在尋找一些安全性。實際上,我正在嘗試編寫腳本來執行一些命令行,我需要小心rm命令。再次感謝 – pops
我想通過類似\([^ $ [:cntrl:]] - [:blank:]] \)#\ 2#來改變第一個/#/#。你能否讓我解釋一下/#/#是如何工作的。 sed和正則表達式不是我的一杯茶。謝謝 – pops
我使用另一個分隔符而不是傳統的'/',它是''''''''''''''''''''''''''''後面的字符以避免任何'/'裏面的模式(在這裏使用的路徑) '\ // \ //' – NeronLeVelu