我目前刚接触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
虽然运行这些命令时没有错误,但它也没有替换我的数据。 任何人都可以帮我解决这个问题..?
答案 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