我有一個包含 3 個捕獲組的字串,想保留第一個和第三個,但對第二個執行替換。我如何在 sed 中表達這一點?
具體來說,我有一個輸入字串,如:
top-level.subpath.one.subpath.two.subpath.forty-five
我想保留第一個之前的部分.,將中間部分縮短為每個單詞的第一個字母,并保留最后一個.. 結果應如下所示:
top-level.s.o.s.t.s.forty-five
為了保留捕獲組,我有:
sed -r 's/([^.]*)(.*)(\..*)/\1...\3/'
這讓我:
top-level....forty-five
為了將類似的東西轉換.subpath.one.subpath.two.subpath為只有首字母,我有:
sed -r 's/(\.[^.])[^\.]*/\1/g'
這讓我:
.s.o.s.t.s
我想基本上應用第二個 sed 運算式來捕獲組 2。有什么方法可以鏈接 sed 替換來僅對第二個捕獲組執行第二個替換,同時保留第一個和第三個?
uj5u.com熱心網友回復:
您可以使用
sed -E ':a; s/^(.*\.[^.])[^.] (\.)/\1\2/; ta' file > newfile # GNU sed
sed -E -e :a -e 's/^(.*\.[^.])[^.] (\.)/\1\2/' -e ta file > newfile # FreeBSD sed
請參閱在線演示。詳情:
-E- 啟用 POSIX ERE 語法(現在是一個或多個量詞,(...)被決議為分組結構):a- 設定a標簽s/^(.*\.[^.])[^.] (\.)/\1\2/- 找到零個或多個字符, a.然后是除 a 之外的任何單個字符.(將其捕獲到組 1 中),然后是除 a 之外的一個或多個字符.,然后匹配并捕獲到組 2 中的點字符,匹配被替換為串聯的第 1 組 第 2 組值ta-a成功更換后轉到標簽。
uj5u.com熱心網友回復:
一個簡單的awk解決方案,適用于任何版本的 awk,包括 MacOS:
s='top-level.subpath.one.subpath.two.subpath.forty-five'
awk 'BEGIN{FS=OFS="."} {for(i=2;i<NF; i) $i=substr($i,1,1)}1' <<< "$s"
top-level.s.o.s.t.s.forty-five
此awk命令.用作輸入和輸出欄位分隔符。我們遍歷欄位位置2到last-1并用該欄位的第一個字符替換每個欄位的值。最后我們列印完整的記錄。
一個 BSDsed解決方案來做同樣的事情:
sed -E -e ':x' -e 's/(. \..)[^.] \./\1./; tx' <<< "$s"
top-level.s.o.s.t.s.forty-five
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E ':a;s/(\..*)\B.(.*\.)/\1\2/;ta' file
捕獲第一個和最后一個句點并挖空中間洗掉任何并排的單詞字符。
改善@anubhava 的 sed 答案:
sed -E 's/(\..)[^.] \./\1./g;s//\1./g' file
使用全域標志并重復相同的替換提供了 2 個命令解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361163.html
