我有某种数据库文件:
key1 val1
key2 val2
key3 val3
...
我想写“hello”而不是val1
我试图做的事情:
while read line
do
var= cut -d ' ' -f 1
if [ $var == "key1" ]
then
????
fi
done < myfile
有没有办法使用FD重定向? (如果存在某种偏移,还是回声?...)
答案 0 :(得分:1)
对于简单替换,请使用sed
:
sed 's/val1/hello/' file
如果val1
在一行上多次出现,则会在每行hello
上替换val1
的第一个实例添加全局标记g
,如:< / p>
sed 's/val1/hello/g' file
sed
的默认行为是打印到stdout
,以便将更改保存到新文件使用重定向:
sed 's/val1/hello/g' file > newfile
或使用-i
的{{1}}选项将更改保存在原始文件中:
sed
答案 1 :(得分:1)
如果你真的需要shell解决方案:
while read key val ; do
if [ "$key" == key1 ] ; then
val=hello
fi
echo "$key $val"
done < myfile
答案 2 :(得分: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可用,那么它就更容易了。
如果你没有在包装器中使用perl,你最好的选择是awk - 它基本上可以在任何有sed的机器上使用,并且它具有对关联数组的一流支持。