Bash 用变量替换字符串中的第 N 个单词



我需要在字符串中找到第 N 个单词(空格分隔)并替换为变量。在下面的示例中,第 4 个单词需要替换为另一个字符串。

1 Test 123456 REPLACE_ME 99

1 Test 123456 $STRING_TO_REPLACE 99

我能够使用 awk '{ print $4}' 找到第 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,您可以像这样替换第 4 个单词:

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

那里的模式意味着:

  • < -- 单词的开头
  • w——"字字"
  • + -- 前一场比赛中的一个或多个
  • w+ -- 一个或多个单词字符
  • s///4中的4表示仅执行第 4 次出现的替换

另一个纯 sh(可能是 bash)解决方案

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

如果你有Ruby

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

相关内容

  • 没有找到相关文章

最新更新