Linux

sed 替換中間字元串

  • September 26, 2022

我有這個這個字元串

22<>22

我有這個清單

test
dev
too

輸出應該像

22test22
22dev22
etc..

這是我用來做的命令

cat list | sed 's/$/22/g' | sed 's/^/22/g'

編輯

我用來做的命令

cat list | sed 's/$/22/' | sed 's/^/22/'

但這沒有幫助因為我有很大的清單

22<>22
3<>33
134423<>4

您可以將替換為的字元串列表分配給數組<>。在一個名為list.txt你應該有的文件中:

test
dev
too

在一個名為你的文件中,data.txt你應該有:

22<>22
3<>33
134423<>4

解決方案 1: 讀取文件list.txt並將其內容分配給數組。

使用 bash 讀取數組

export IFS=$'\n'
readarray array < list.txt

使用 zsh 讀取數組

array=("${(@f)"$(<list.txt)"}") 

最後,您必須遍歷array變數以獲取列表的每個元素並替換為sed

for i in ${array[@]}; do 
sed "s/<>/$i/g" data.txt
done

注意: for 循環會將文本列印到標準輸出(在您的終端中)。但是如果你想將輸出重定向到一個文件,你可以使用>afterdone關鍵字:

for i in ${array[@]}; do 
sed "s/<>/$i/g" data.txt
done > final.txt

此解決方案將產生如下輸出:

22test22
3test33
134423test4
22dev22
3dev33
134423dev4
22too22
3too33
134423too4

解決方案 2: 首先,您必須讀取文件list.txt並將其內容分配給數組。 使用 bash 讀取數組

export IFS=$'\n'
readarray array < list.txt

使用 zsh 讀取數組

array=("${(@f)"$(<list.txt)"}") 

之後,您必須遍歷文件的每一行data.txt並在該循環內從數組中讀取每個項目以應用sed命令:

while read line ; do 
for i in ${array[@]}; do 
  sed "s/<>/$i/g" <<< "$line"
done
done < data.txt

或將標準輸出重定向到文件:

while read line ; do 
for i in ${array[@]}; do 
  sed "s/<>/$i/g" <<< "$line"
done
done < data.txt > final.txt

此解決方案將產生以下輸出:

22test22
22dev22
22too22
3test33
3dev33
3too33
134423test4
134423dev4
134423too4

引用自:https://unix.stackexchange.com/questions/718671