2012-09-15 46 views
0

我有一個包含許多/的每行,如文件:如何用不同的符號替換符號的第一次,中間和最後一次出現?

This/is/an/example. 
This/is/another/example/to/read. 
Read/this/example. 
Last/example. 

我需要\BEGIN/\END每行的最後出現,以取代在每行的/第一次出現,並且所有剩餘的/\MIDDLE。例如,上述文件將成爲這個:

This\BEGINis\MIDDLEan\ENDexample. 
This\BEGINis\MIDDLEanother\MIDDLEexample\MIDDLEto\ENDread. 
Read\BEGINthis\ENDexample. 
Last\BEGINexample. 

我如何可以替換使用bash或Linux上提供的其他工具這樣這個符號,如grep

+0

在那裏只出現3次或更多? – alfasin

+0

可能會少一些。我已經更新了示例以顯示發生1或2次事件的情況。如果一行中沒有出現,則沒有任何更改。 – Village

+0

你打算使用哪種語言? bash腳本? PHP的?正則表達式?你應該在你的問題和標籤中包含所有這些信息 - 否則你會減少相關人員跟蹤你的問題並幫助你的機會。 – alfasin

回答

1

你可以嘗試grepping ^([a-zA-Z] +)[](。*)[]([a-zA-Z] +)$ 並以$ 1/BEGIN $ 2/END $ 3取代

然後grep的所有\和replcae他們/ MIDDLE

4

我會用sed(你需要sed -E在Mac OSX擴展的正則表達式):

sed -E 's/\//\\BEGIN/; s/\/([^/]+$)/\\END\1/; s/\//\\MIDDLE/g' 

它的工作原理,因爲第一s命令沒有g(全局)標誌,所以只有第一個oc /的替換被替換。第二個s憑藉$取代最後一次出現,最後最後一次替換替換所有剩餘的正斜槓。替換順序很重要:如果有一個正斜槓,則得到//BEGIN,如果有另一個則得到//END

+1

請注意,您可以使用任何東西作爲'sed''s's'命令的分隔符,而不僅僅是斜槓。所以這更易讀:'sed -E':/:\\ BEGIN :;; S:/([^ /] + $):\\ END \ 1 :; s:/:\\ MIDDLE:g'' – user123444555621

+0

這取代了第一個'/',但所有其他'/'都被'\ MIDDLE'替代。沒有'/'成爲'\ END'。 – Village

1
while IFS=/ read -a f; do (
    set -- "${f[@]}" 
        printf "$1"      && shift 
    (($#))  && printf "\\BEGIN$1"    && shift 
    (($# > 1)) && printf "\\MIDDLE%s" "${@:1:$#-1}" && shift $(($#-1)) 
    (($#))  && printf "\\\\END$1" 
        printf "\n" 
    ) 
done < input.txt 

輸入被讀取一次在一個線,分割上/字符的每一行和將結果存儲在一個子shell的位置參數。第一個字段(我們假設存在)被無條件打印,並且每個剩餘字段的前面都打印了正確的分隔符。終止換行符無條件打印。

(我不完全知道爲什麼需要END雙層雙反斜線。沒有它,我只印完的d。)

+0

這個腳本刪除出現在行尾的'/'。 – Village

相關問題