2つの列を持つファイルがあります。
cat test.txt
100 2007
FFF 1993
7E7 1994
4BB 1995
各行をスクリプトに入力し、2つの列を別々の変数として割り当てて、異なるループを介して実行してから次の行に移動できるようにする必要があります。
ファイルのリストが長く、各ペアに対して検索と置換機能を実行する必要があります。コレクションをすでに計画している年に変換しています。
私のスクリプトは次のとおりです。
SET=$1
YEAR=$2
for i in `ls` ; do
sed -i "" 's/"$1"/"$2"/g' $i;
done
test.txtで改行ループスクリプトを使用する方法がわかりません。
ベストアンサー1
read
スペース(ファイルで使用されているものと似ています)に基づいて行を分割できます。このような:
while read set year; do
DoStuffWith "$set" "$year"
done <test.txt
その他の注意事項:
上記の例では、小文字の変数名を使用しました。特別な意味を持つ大文字の名前がたくさんあり、それらとの衝突を避ける最も安全な方法は、小文字または大文字と小文字の混合変数を使用することです(ただし、考える特別な意味)。
出力を繰り返さないでください
ls
、いくつかのケースでは、奇妙な解析を避けるために 。を使用しfor i in *; do
て二重引用符で囲みます。$i
sed
を使用している場合は、これを行う必要はありませんsed -i "" 'whatever' *
。sed
コマンドで一重引用符で囲まれた文字列内で変数置換と二重引用符を使用しようとしているようですが、うまくいきません。二重引用符が実際に検索/置換文字列の一部になることを望まない場合は、代わりに次のように使用してください。sed -i "" "s/$set/$year/g" *
文字列の検索と置換にリテラル二重引用符を使用するには、エスケープしてください。
sed -i "" "s/\"$set\"/\"$year\"/g" *
ファイルを繰り返し、各行ごとに各ファイルを繰り返して文字列を置き換えるようです。なぜ走らないのですか?みんな代替?つまり、
sed
コマンドを使用して実行しs/100/2007/g
、再びコマンドを使用しs/FFF/1993/g
、再びコマンドを使用する代わりに... コマンドを一度実行するのはどうでしょうかs/100/2007/g; s/FFF/1993/g; s/7E7/1994/g; ...
?sed
次のループでコマンドを作成する必要があります。sedCommand="" while read set year; do sedCommand+="s/$set/$year/g; " done <test.txt sed -i "" "$sedCommand" *
最後に、このようなグローバルな代替案が心配です。 「2007」に置き換える必要がある場合を除いて、どのファイルにも「100」が表示されないことは確実ですか? test.txtファイルが含まれていますか?
これらすべてのファイルのバックアップはありますか?何も失いたくない前に本当にこれをしなければなりません。