3

ディレクトリ内のファイルを反復処理し、次の置換を実行する必要があります。

前:

${USER_NAME} さん、こんにちは。${HOME_ADDRESS} にお住まいです。現在 ${TIME} です

後:

こんにちは ${userName} さん、あなたは ${homeAddress} に住んでいます。現在 ${time} です

${} 内に表示されるさまざまなトークンの数が多いため、実際には実行できません。

find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;

次のような単一のコマンドを使用して、この置換を実行できることを願っています。

find . -name '*' -exec sed 's/XXX/YYY/g' {} \;

しかし、XXX と YYY を何に置き換えるかわかりません。単一のコマンドでこれを行うことは可能ですか?

乾杯、ドナル

4

3 に答える 3

4

わかりやすくするためにフォーマット:

sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                   s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                   s/\$\{TIME\}/\$\{time\}/g
                  }'

where/^Hello/は、操作したい行を識別し (必要に応じてより具体的にします)、残りは各変数名に置き換えられます。


これをスクリプトに記述する場合は、HERE ドキュメントを使用してフォーマットを維持し、読みやすく更新しやすくすることを検討してください...

于 2008-10-27T21:05:09.477 に答える
2

sed への-iフラグは、ファイルをその場で編集します。XXX と YYY には、次のようなものを使用します。

sed -i 's/USER_NAME/userName/g'

等々。

更新: あなたの質問は、「USER_NAME」を「userName」に自動的に変更することに関するものでした。次の Perl スクリプトを試すことができます。

sub convert {
    my $r = lc $_[0];
    $r =~ s/_(.)/\U$1\E/g;
    return $r;
}
while (<>) {
    s/\${([A-Z_]+)}/\${@{[convert $1]}}/g;
    print;
}

次のように実行します。

perl -i convert.pl inputfile.txt

出力例:

$ cat inputfile.txt
Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
$ perl -i convert.pl inputfile.txt
$ cat inputfile.txt
Hello ${userName}, you live at ${homeAddress}. It is now ${time}
于 2008-10-27T20:57:02.813 に答える
0

上記の答えは本当にうまくいきます。完全を期すために、私はあなたができることを追加するかもしれません:

sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
   | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
   | sed 's/\$\{TIME\}/\$\{time\}/g'

それらは機能的に同一です (私の場合は stdout にダンプすることを除いて、どこかに配置する必要があります (ただし、e のように正規表現を定期的に台無しにする場合に備えて、オリジナルを保持する必要があります)。 1 つの sed コマンドから始めて、さらに追加することができます

!! | sed 'yet-enother-regexp'

矢印キー?viモード?誰がそのようなものを必要としますか? :)

于 2008-10-27T21:12:29.787 に答える