簡體   English   中英

如何使用sed替換部分字符串

[英]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|'
  • 圖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

如果您的目錄總是深度為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM