替换特定列和行上的数据

时间:2015-01-11 12:37:36

标签: bash shell

我目前刚接触shell脚本,我在更换数据方面遇到了问题。我需要替换特定列和行的数据。

以下是随机数据库:

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

例如,我想将“test3”替换为“已更改”。我该如何实现?我尝试了几个像

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

虽然运行这些命令时没有错误,但它也没有替换我的数据。 任何人都可以帮我解决这个问题..?

2 个答案:

答案 0 :(得分:1)

你的awk版本对我来说很好,稍作修改:

$ row=1
$ replace=changed
$ awk 'BEGIN{FS=OFS=":"}NR==n{$4=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

答案 1 :(得分:0)

这是一个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))"'\}\)[^:]*/\1'"$replace"'/' /tmp/file

cat /tmp/file