我需要在字符串中找到第N个字(空格分隔)并用变量替换。 在下面的示例中,第4个单词需要替换为另一个字符串。
1 Test 123456 REPLACE_ME 99
到
1 Test 123456 $STRING_TO_REPLACE 99
我能够使用awk '{ print $4}'
找到第四个单词,但不知道如何用另一个字符串变量替换。
非常感谢任何帮助。
答案 0 :(得分: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 } }'
答案 1 :(得分:2)
使用awk
str="1 Test 123456 REPLACE_ME 99"
STRING_TO_REPLACE="Hello"
echo $str |awk -v r=${STRING_TO_REPLACE} '{$4=r}1'
答案 2 :(得分:1)
这是两个shell解决方案。第一个是纯粹的解决方案:
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
答案 3 :(得分:1)
如果你想替换第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\+
- 一个或多个单词字符4
中的s///4
表示仅执行第4次出现的替换答案 4 :(得分:0)
另一种纯粹的sh(可能是bash)解决方案
set -- 1 Test 123456 REPLACE_ME 99
set -- "${@:0:4}" SOMETHING_ELSE "${@:5}"
答案 5 :(得分:0)
如果你有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