2015-08-28 51 views
0

我的問題一個字符串的結尾是安靜簡單,但我想我錯過了什麼地方,SED提取與正則表達式

我想提取以下字符串的路徑:「RM -rf/tmp目錄/富/ tmp目錄/條」

我已經試過:

echo "rm -rf /tmp/foo" | sed 's/rm (-[A-Za-z]*)*\(.*\)/\1/' 

我期待的結果:

/tmp/foo 

我在AIX和我不沒有GNU擴展選項

謝謝

回答

0

如果您需要一些安全性和/或容差

YourSource \ 
| sed 's#^[[:blank:]]*rm\([[:blank:]]\{1,\}-[[:alpha:]]\{1,\}\)*[[:blank:]]\{1,\}/#/# 
     t 
     s/^/#/' 

假設:

  • 沒有/開始路徑之前(例如:在-e參數)
  • 文件FQN與/開始(好像它是/tmp文件夾,所以沒關係)
    • 您可以根據實際需要更改第一個/#/#\([^$[:cntrl:]]-[:blank:]]\)#\2#

增加安全性:

  • 如果第一replacment不這樣做(沒有模式匹配),輸出的是原來的,但與前一個#因爲具有rm -fr字符串的工作是非常危險的,當事情有點(如在這種情況下文件名與空間)
+0

非常感謝這個完整的答案!我正在尋找匹配一個真正的路徑,所以它可以只是一個文件名或真正的路徑,如/ bar/foo/abc/.../...如果第一個替換沒有完成,添加#的想法是完美的對於我的情況,我正在尋找一些安全性。實際上,我正在嘗試編寫腳本來執行一些命令行,我需要小心rm命令。再次感謝 – pops

+0

我想通過類似\([^ $ [:cntrl:]] - [:blank:]] \)#\ 2#來改變第一個/#/#。你能否讓我解釋一下/#/#是如何工作的。 sed和正則表達式不是我的一杯茶。謝謝 – pops

+0

我使用另一個分隔符而不是傳統的'/',它是''''''''''''''''''''''''''''後面的字符以避免任何'/'裏面的模式(在這裏使用的路徑) '\ // \ //' – NeronLeVelu

1

您需要轉義paranthesis。

echo "rm -rf /tmp/foo" | sed 's/rm \(-[A-Za-z]* \)*\(.*\)/\2/' 

在BRE,如果你不逃paranthesis,它會像對待()爲文字符號。

+0

http://ideone.com/3VI4pG –

+0

完美的作品,感謝您的解釋 – pops

1
echo "rm -rf /tmp/foo" | sed -r 's/rm (-[A-Za-z]*)*(.*)/\2/' 

你有兩個比賽組,首先將匹配-rf,二是/tmp/foo

有雙向兩個更新你的命令, 刪除第一個比賽組
或 變化\1\2