単一ファイルを繰り返し編集

単一ファイルを繰り返し編集

次のステートメントを含むファイルがあります。

myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(255)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(255)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(255)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(255)
etc

私はそれを次のように変更したいと思います:

myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)
etc

とにかく、追加の質問は、属性名が「in $」で終わる項目だけを変更したいということです。ここで $ は数値です (例: myName_in_3 VARCHAR(255))。

偶然にも '_in' (インディケータ属性) がペアで出てくるので、n~2 (または FNR%2==0) を実行するのはかなり賢い方法ですが、 '_in$VARCHAR(' を識別する方が良いかどうか疑問に思います。 ?255 )'を変化のモデルにしている。

わかりやすいコードを使用してこれをどのように実行しますか?ファイルが大きくないため、パフォーマンスは大きな問題にはなりません。

答え1

first~stepGNU sedを使用すると、2行目から始まる他のすべての行が変更されるようにフォーマットで行アドレスを指定できます2~2

$ sed '2~2 s/(255)/(1)/' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)

答え2

そしてawk

$ awk 'FNR%2==0{sub(255,1)}1' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)

説明する

  • FNR%2==0偶数行だけが一致します。
  • 行が偶数の場合255はに1置き換えますsub(255,1)
  • 1awk印刷のための実際の条件です$0

次のような他のツールにも同じロジックを使用できますperl

perl -pe 's/255/1/ unless $. % 2' file

を使用すると、sed次のことができます。

sed -e 'n;s/255/1/' file

修正する

お客様の更新リクエストに応じて、ソリューションを若干変更することがあります。

そしてawk

awk '/_in_[0-9]/{sub(255,1)}1' file

そしてsed

sed -e '/_in_[0-9]/{s/255/1/}' file

そしてperl

perl -pe 's/255/1/ if /_in_[0-9]/' file

答え3

持つ

sed '/_in_/ s/255/1/'

つまり、一致する行を検索してに/_in_/置き換え255ます1

答え4

cat oldfile.txt |awk '/_in_[0-9]/{sub(255,1)}1' > newfile.txt

関連情報