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是唯一的常量部分。路徑總是六層深。所以它可能並不總是在標籤和核心之間。
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是唯一的常量部分。路徑總是六層深。所以它可能並不總是在標籤和核心之間。
通過使用重複量詞,你可以輕鬆地調整您的替換是由:
echo "/home/repository/tags/1.9.1/1.9.1.8/core" | \
sed -r 's|(/([^/]+/){3})([^/]+/){2}(.*)|\1XXX/\4|'
你甚至可以使用變量:
$ 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
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
我喜歡@作爲分隔符。我總是忘記你能做到這一點。您的解決方案更強大。 – 2010-11-17 18:37:25
如果目錄始終是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
在這裏,請記住一些正則表達式的痛苦:
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/
和最後一個組件之間去掉了一切。請注意,我使用+
而不是*
,所以組件必須是非空的。這將防止有一個尾隨斜線。
澄清:您想要始終用特定字符串替換路徑的第四和第五個組件? – Cascabel 2010-11-17 18:14:50
是的 - 我不妨說可能超過六個組件。 – Michael 2010-11-17 18:18:09