2016-12-14 80 views
2

我想用每個字符串的最後一個字符串(例如,「\」)替換字母數字和反斜槓之間的所有斜線「/」。在同一行替換爲SED多次發生

nocareNocare abc\/def/ghi/mno\/pq/r abc\/def\/ghi/mno\/pq/r 

應該變成:

nocareNocare abc\/def\/ghi\/mno\/pq/r abc\/def\/ghi\/mno\/pq/r 

我用:

sed 's/\(.*\)\([[:alnum:]]\)\/\([[:alnum:]]\)\(\S*\)\(\\\|\/\)/\1\2\\\/\3\4\//g' 

簡短說明:符合

任何字符串+ alnum +/+任何非白+ /或\

但它只替換一個案例,所以我需要運行它3次以取代所有3次出現。看起來像第一次一路匹配:

>nocareNocare abc\/def/ghi/mno\/pq/r abc\/def\/ghi/ 

,而不是

>nocareNocare abc\/def/ 

回答

1

您可以使用基於以下regEx的一個perl命令行的解決方案

(?<!\\)

不是反斜槓

(?!\w+\s)

之後沒有字尾字符以空格結尾

perl -pe 's;(?<!\\)/(?!\w+\s);\\/;g' file 
nocareNocare abc\/def\/ghi\/mno\/pq/r abc\/def\/ghi\/mno\/pq/r 
+0

你破解了!感謝您從開始到結束的幫助!我也處理斜槓前有下劃線的情況,這很好。 – user2405602

+0

@ user2405602:乾杯!樂於幫助! – Inian

1

隨着GNU sed的:

sed -E 's:([^\])/:\1\\/:g;s:\\/([^\]*(|$)):/\1:g' file 

兩個s命令在這裏:

  • s:([^\])/:\1\\/:g全部替換與/
+0

謝謝,但這是不行的,因爲你描述的第二步也替換了一些在初始版本中有的「\ /」,而我不想。 – user2405602

2
sed -e :a -e 's|\([a-z0-9]\)/\([a-z0-9][^ ]*[a-z0-9]/[a-z0-9]\)|\1\\/\2|;ta' filename 

大致翻譯線的空間或年底前不是由\\/

  • s:\\/([^\]*(|$)):/\1:g之前更換最後\/,這個說「代替一個孤獨的斜線加上一些其他的東西在字符串中,然後是另一個單斜槓,帶有反斜槓斜線和相同的東西(和第二個斜線)。而做出這樣的替換之後,重新開始。」