[英]how to replace part of a string using sed
echo "/home/repository/tags/1.9.1/1.9.1.8/core" | sed "s/HELP/XXX/g"
我想要一些幫助來替換標簽和核心之間的內容,讓我們說XXX。 所以我想要的輸出是/ home / repository / tags / XXX / core。
字符串是目錄路徑,其中/ home / repository / tags是唯一的常量部分。 路徑總是六層深。 所以它可能並不總是在標簽和核心之間。
echo "/home/repository/whatever/1.9.1/1.9.1.8/core/and/more/junk" \
| sed 's@\(/[^/]*/[^/]*/[^/]*\)/[^/]*/[^/]*@\1/XXX@'
收益率......
/home/repository/whatever/XXX/core/and/more/junk
通過使用重復量詞,您可以輕松調整替換的位置:
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
如果您的目錄總是深度為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 's@/home/repository/tags/.*/\(.\+\)$@/home/repository/tags/XXX/\1@'
如果您真正想要做的就是刪除tags/
和最后一個組件之間的所有內容,則無需顯式匹配組件。 請注意,我使用+
not *
,因此組件必須是非空的。 這樣可以防止出現斜線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.