替换特定列和行上的数据

Replace data on specific column and row

我目前是 shell 脚本编写的新手,我在替换数据时遇到问题。我需要替换特定列和行的数据。

下面是一个随机数据库:

test:test1:test2:test3:test4    
example:example1:example2:example3:example4    
sample:sample1:sample2:sample3:sample4

例如,我想将单词 "test3" 替换为 "changed".. 我该如何实现?我尝试了几个命令,比如

awk -F : 'NR==n{=a}1' n="$row" a="$replace" test.txt
sed -i "$row"'s/\S\+/'"$replace"'/4' test.txt

虽然我运行这些命令没有错误,但它也没有替换我的数据。 谁能帮我解决这个问题..?

你的 awk 版本稍作修改后对我来说工作正常:

$ row=1
$ replace=changed
$ awk 'BEGIN{FS=OFS=":"}NR==n{=a}1' n="$row" a="$replace" file
test:test1:test2:changed:test4    
example:example1:example2:example3:example4    
sample:sample1:sample2:sample3:sample4

我已经定义了输出字段分隔符 OFS,这样被修改的行在每个字段之间仍然有 :。要覆盖原始文件,只需执行 awk '...' file > tmp && mv tmp file.

这是一个 sed 一行(使用就地编辑):

#!/bin/bash

cat > /tmp/file <<EOF
test:test1:test2:test3:test4    
example:example1:example2:example3:example4    
sample:sample1:sample2:sample3:sample4
EOF

row=1
column=4
replace=changed
sed -i "$row"'s/^\(\([^:]*:\)\{'"$(($column - 1))"'\}\)[^:]*/'"$replace"'/' /tmp/file

cat /tmp/file