0

我有某种数据库文件:

key1 val1
key2 val2
key3 val3
...

我想写“你好”而不是 val1

我试图做的:

while read line
do
    var= cut -d ' ' -f 1
    if [ $var == "key1" ]
    then
        ????
    fi
done < myfile

有没有办法使用 FD 重定向?(或者如果有某种偏移,则回声?...)

4

3 回答 3

1

对于简单的替换使用sed

sed 's/val1/hello/' file

这将用if在一行上多次出现替换val1每行上的第一个实例,添加全局标志,如:helloval1g

sed 's/val1/hello/g' file

的默认行为sed是打印到stdout以便将更改保存到新文件使用重定向:

sed 's/val1/hello/g' file > newfile

或使用-i选项sed将更改保存在原始文件中:

sed -i 's/val1/hello/g' file
于 2013-01-08T13:13:45.307 回答
1

如果你真的需要一个 shell 解决方案:

while read key val ; do
    if [ "$key" == key1 ] ; then
        val=hello
    fi
    echo "$key $val"
done < myfile
于 2013-01-08T13:24:24.097 回答
0

您要查找的内容称为“关联数组”,在 Perl 中也称为“哈希”,或“键值存储”或“字典查找”。Bourne shell 不直接支持它们。Awk、Perl 和 Bash 都有关联数组。有一些方法可以在 bourne shell 中将关联数组组合在一起,但它们很丑陋。您最好的选择是 a) 选择一种更适合手头任务的语言或 b) 如果您必须使用 bourne shell,请使用更强大的语言围绕关联数组编写一个包装函数(这本质上是 sudo_O 使用 sed 所做的)。

#! /bin/sh

lookup() {
    perl -e '%hash = ( "key1" => "hello", "key2" => "val2", "key3" => "val3" );          
             print $hash{ $ARGV[0] }
            ' $1
}

x=$(lookup "key1")
echo $x

这比纯 bourne shell 的便携性差,但如果你有 perl 可用,这是一条更容易的路线。

If you don't have perl to use in a wrapper, your best bet would be awk -- it's essentially available on any machine which has sed, and it has first class support for associative arrays.

于 2013-01-08T13:45:42.860 回答