2010-11-17 37 views
3
echo "/home/repository/tags/1.9.1/1.9.1.8/core" | sed "s/HELP/XXX/g" 

我想用一些幫助替換標籤和核心之間的內容,讓我們說XXX。所以我希望的輸出將是/ home/repository/tags/XXX/core。如何用sed代替部分字符串

該字符串是目錄路徑,其中/ home/repository/tags是唯一的常量部分。路徑總是六層深。所以它可能並不總是在標籤和核心之間。

+0

澄清:您想要始終用特定字符串替換路徑的第四和第五個組件? – Cascabel 2010-11-17 18:14:50

+0

是的 - 我不妨說可能超過六個組件。 – Michael 2010-11-17 18:18:09

回答

2

通過使用重複量詞,你可以輕鬆地調整您的替換是由:

echo "/home/repository/tags/1.9.1/1.9.1.8/core" | \ 
    sed -r 's|(/([^/]+/){3})([^/]+/){2}(.*)|\1XXX/\4|' 
  • 3代表有多少分量,以保持在年初
  • 2代表多少更換

你甚至可以使用變量:

$ dirs='/one/two/three/four/five/six/seven/eight' 
$ for keep in {0..3}; do for replace in {0..3}; do echo "$dirs" | \ 
    sed -r "s|(/([^/]+/){$keep})([^/]+/){$replace}(.*)|\1XXX/\4|"; done; done 
/XXX/one/two/three/four/five/six/seven/eight 
/XXX/two/three/four/five/six/seven/eight 
/XXX/three/four/five/six/seven/eight 
/XXX/four/five/six/seven/eight 
/one/XXX/two/three/four/five/six/seven/eight 
/one/XXX/three/four/five/six/seven/eight 
/one/XXX/four/five/six/seven/eight 
/one/XXX/five/six/seven/eight 
/one/two/XXX/three/four/five/six/seven/eight 
/one/two/XXX/four/five/six/seven/eight 
/one/two/XXX/five/six/seven/eight 
/one/two/XXX/six/seven/eight 
/one/two/three/XXX/four/five/six/seven/eight 
/one/two/three/XXX/five/six/seven/eight 
/one/two/three/XXX/six/seven/eight 
/one/two/three/XXX/seven/eight 
3
echo "/home/repository/whatever/1.9.1/1.9.1.8/core/and/more/junk" \ 
| sed '[email protected]\(/[^/]*/[^/]*/[^/]*\)/[^/]*/[^/]*@\1/[email protected]' 

產量...

/home/repository/whatever/XXX/core/and/more/junk 
+0

我喜歡@作爲分隔符。我總是忘記你能做到這一點。您的解決方案更強大。 – 2010-11-17 18:37:25

1

如果目錄始終是6級深,這個工程(記得要逃脫圓括號):

echo "/home/repository/tags/1.9.1/1.9.1.8/core" | 
sed 's/\(\/home\/repository\/tags\/\).*\/.*\(\/.*\)/\1XXX\2/' 

生產:

/home/repository/tags/XXX/core 
0

在這裏,請記住一些正則表達式的痛苦:

echo "/home/repository/tags/1.9.1/1.9.1.8/core" | sed '[email protected]/home/repository/tags/.*/\(.\+\)[email protected]/home/repository/tags/XXX/\[email protected]' 

無需顯式地匹配組件,如果你真的是在努力做的是tags/和最後一個組件之間去掉了一切。請注意,我使用+而不是*,所以組件必須是非空的。這將防止有一個尾隨斜線。