2014-01-07 204 views
2

我需要在字符串中找到第N個字(空格分隔)並用變量替換。 在下面的例子中,第4個單詞需要用另一個字符串替換。Bash用變量替換字符串中的第N個字

1 Test 123456 REPLACE_ME 99 

1 Test 123456 $STRING_TO_REPLACE 99 

我能找到使用awk '{ print $4}' 4個字,但不知道如何與另一個字符串變量替換。

任何幫助將不勝感激。

回答

1

以下是兩個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 
2
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 } }' 
+4

'{$ 4 = R;打印}'看起來更簡單 –

0

另一個純SH(可能是bash)的解決方案

set -- 1 Test 123456 REPLACE_ME 99 
set -- "${@:0:4}" SOMETHING_ELSE "${@:5}" 
2

用awk

str="1 Test 123456 REPLACE_ME 99" 
STRING_TO_REPLACE="Hello" 

echo $str |awk -v r=${STRING_TO_REPLACE} '{$4=r}1' 
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次替換操作
+0

非常感謝!正則表達式是wordl中最複雜的東西! – Justin

+0

@ user3171185謹慎接受其中的一個好答案?或者這個呢? (wink^wink ^) – janos

0

,如果你有紅寶石

# echo "1 Test 123456 REPLACE_ME 99" | ruby -e 'f=gets.split(/\s+/);f[3]="new";puts f.join(" ")' 
1 Test 123456 new 99