2017-10-29 58 views
1

冒號點我需要一個sed正則表達式線,這將改變冒號到圍繞一個變量從該SED線改變周圍在bash

a:b:c :d: e:f 

a:b:c: .d. e:f 

諸如點( d變量)。我在網上搜索了無數個小時,試圖找到解決方案......當Google忽略大多數標點符號時,這不是一件容易的事。我還搜索了幾十個shell腳本書和PDF,但無濟於事。儘管我使用了單個字母,但本例中的每個字母都可以是完整的變量,例如

cat:dog:bird :rabbit: mouse:rat 

rabbit),甚至路徑名:

/home/someone/bin:/home/someone/.local/bin:/usr/local/sbin :/usr/local/bin: /usr/games:/usr/local/games:/snap/bin 

/usr/local/bin)。所有的例子都有一個共同點,那就是中間的一個變量,它被冒號包圍着,需要改變爲句點。這甚至可能與sed?任何幫助是極大的讚賞。

+1

你是否也有大約要替換如下所示什麼空間?或者你是否需要在第三和第四個冒號之間進行切換? – Sundeep

+1

想法:您可能無法在網絡上找到現成的sed字符串來實現您所尋求的。您可能需要(如果您還沒有)嘗試構建常規搜索並自己替換表達式以實現您的特定目標。關於如何構建查找和替換字符串,有一些很好的pdf,網頁和utube vids。如果你確實找到了能夠完成這項工作的人,那麼你可以爲他人發佈你的解決方案來解決這個特定的模式識別問題。 –

+0

爲什麼':b:'和':dog:'沒有被替換? –

回答

0

你所說的變量不完全清楚。如果它是一個字(字母數字和下劃線僅字符),你可以使用:

sed -E 's/(^|\s):(\w+):($|\s)/\1.\2.\3/' 

但是,如果它是一個路徑,事情要複雜得多,因爲路徑幾乎可以包含任意字符,包括空格...如果你想要一個適用於路徑的正則表達式,你必須告訴我們更多關於你擁有的路徑。

1

如果它總是需要更換,你可以用awk像第二個字符串:

$ awk '{gsub(/^:|:$/,".",$2)}1' file 
a:b:c .d. e:f 

(如果你想切換領先,並在所有的字符串尾隨冒號,用途:

$ awk '{for(i=1;i<=NF;i++)gsub(/^:|:$/,".",$i)}1' file 
0

如果它的中間有3個部分。 您可以使用

sed 's/ :\([^:]*\):/.\1. /' 

或者如果您有標籤

sed 's/\t:\([^:]*\):\t/\t.\1.\t/' 

但變量不能有:在它