我需要在字符串中找到第N個字(空格分隔)並用變量替換。 在下面的例子中,第4個單詞需要用另一個字符串替換。Bash用變量替換字符串中的第N個字
1 Test 123456 REPLACE_ME 99
到
1 Test 123456 $STRING_TO_REPLACE 99
我能找到使用awk '{ print $4}'
4個字,但不知道如何與另一個字符串變量替換。
任何幫助將不勝感激。
我需要在字符串中找到第N個字(空格分隔)並用變量替換。 在下面的例子中,第4個單詞需要用另一個字符串替換。Bash用變量替換字符串中的第N個字
1 Test 123456 REPLACE_ME 99
到
1 Test 123456 $STRING_TO_REPLACE 99
我能找到使用awk '{ print $4}'
4個字,但不知道如何與另一個字符串變量替換。
任何幫助將不勝感激。
以下是兩個shell解決方案。第一個是純SH溶液:
set -- 1 Test 123456 REPLACE_ME 99
one=$1
two=$2
three=$3
shift 4
echo $one $two $three '$STRING_TO_REPLACE' $*
的輸出是:
1 Test 123456 $STRING_TO_REPLACE 99
第二個是一個bash溶液:
set -- 1 Test 123456 REPLACE_ME 99
echo ${*:1:3} '$STRING_TO_REPLACE' ${*:5:$#}
此輸出:
1 Test 123456 $STRING_TO_REPLACE 99
replace='replace me'; echo "233131 2 saad four five dssd sdad" | awk -v r="$replace" '{ for(i = 1; i <= NF; i++) { if (i == 4)print r;else print $i } }'
另一個純SH(可能是bash)的解決方案
set -- 1 Test 123456 REPLACE_ME 99
set -- "${@:0:4}" SOMETHING_ELSE "${@:5}"
用awk
str="1 Test 123456 REPLACE_ME 99"
STRING_TO_REPLACE="Hello"
echo $str |awk -v r=${STRING_TO_REPLACE} '{$4=r}1'
如果您要更換的第N個字,你可以這樣做:
awk -v n=4 -v r="$STRING_TO_REPLACE" '{ $n = r } 1' <<< "$str"
使用GNU sed,你可以像這樣替換第4個字:
str="1 Test 123456 REPLACE_ME 99"
STRING_TO_REPLACE="Hello"
sed -e "s/\<\w\+/STRING_TO_REPLACE/4" <<< "$str"
模式有指:
\<
- 單詞開始\w
- 「字字符」\+
- 一個或多個以前匹配的\w\+
- 一個或更多的單詞字符4
in s///4
表示僅執行第4次替換操作,如果你有紅寶石
# echo "1 Test 123456 REPLACE_ME 99" | ruby -e 'f=gets.split(/\s+/);f[3]="new";puts f.join(" ")'
1 Test 123456 new 99
'{$ 4 = R;打印}'看起來更簡單 –