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

本当にシェル ソリューションが必要な場合:

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

単純な置換には、次を使用しますsed

sed 's/val1/hello/' file

val1これにより、各行の最初のインスタンスが 1 行に複数回表示される場合に置き換えられ、次のようなグローバル フラグが追加さhelloれます。val1g

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 に答える
0

あなたが探しているものは、「連想配列」と呼ばれ、Perl では「ハッシュ」、または「キー値ストア」または「辞書ルックアップ」とも呼ばれます。Bourne シェルはそれらを直接サポートしていません。Awk、Perl、Bash にはすべて連想配列があります。bourne シェルで連想配列をハッキングする方法はいくつかありますが、それらは醜いものです。あなたの最善の策は、a)当面のタスクにより適した言語を選択するか、b)ボーンシェルを使用する必要がある場合は、連想配列の周りにラッパー関数をより機能的な言語で記述します(これは本質的に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 シェルよりも移植性が低くなりますが、perl を使用できる場合は、はるかに簡単な方法です。

ラッパーで使用する perl がない場合、最善の策は awk です。これは基本的に、sed を備えたすべてのマシンで利用可能であり、連想配列に対するファースト クラスのサポートを備えています。

于 2013-01-08T13:45:42.860 に答える