簡體   English   中英

Bash用變量替換字符串中的第N個單詞

[英]Bash replace Nth word in a string with a variable

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

1 Test 123456 REPLACE_ME 99

1 Test 123456 $STRING_TO_REPLACE 99

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

任何幫助都感激不盡。

   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 } }'

使用awk

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

echo $str |awk -v r=${STRING_TO_REPLACE} '{$4=r}1'

這是兩個外殼解決方案。 第一個是純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

如果要替換第N個字,可以這樣:

awk -v n=4 -v r="$STRING_TO_REPLACE" '{ $n = r } 1' <<< "$str"

使用GNU sed,您可以這樣替換第四個單詞:

str="1 Test 123456 REPLACE_ME 99"
STRING_TO_REPLACE="Hello"
sed -e "s/\<\w\+/STRING_TO_REPLACE/4" <<< "$str"

那里的模式意味着:

  • \\< -詞的開頭
  • \\w “文字字符”
  • \\+ -上一場比賽中的一項或多項
  • \\w\\+ -一個或多個單詞字符
  • s///4 4s///4表示僅對第4個事件進行替換

另一種純sh(可能是bash)解決方案

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

如果你有露比

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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