パターンが特定の位置にある場合に線を削除する方法

パターンが特定の位置にある場合に線を削除する方法

ファイルから行を削除するのに問題があります。私のプログラムはwhileとifのループを使って特定の条件をチェックし、一致する場合はファイルからその行を削除します。ただし、削除中に「sed:can read」などのエラーが発生します。私は解決策に近いと思いますが、それを理解することはできません。以下は私が使用するコードです。

#!/bin/ksh

File='dsgp_p50.dat'
cd /home/lpadmin
while read -r line
do
x=`echo "$line" | cut -c 75-104`
echo $x
if [ $x == '00000000000000+00000000000000+' ]
then
sed '1,1d' "$line" > vikas.dat
fi
done < $File

修正する:

次の形式のデータを含むファイルがあります。

507425B30    171013D248900022   4057-ACCR PROPERTY TAX  
00000000257910+00000000000000+00000000257910+00000000000000+00000000000000+
507425B30    171013C249999092   1071-DO NOT USE         
00000000000000+00000000000000+00000000000000+00000000031940+00000000000000+

これで、00000000000000+00000000000000+ などのパターンを含む行を削除する必要があります。 (ファイルのパターン位置は75-104です。)トリッキーな部分は、同じ行に最初に表示されたときにのみ行を削除する必要があることです。 。上記の最初のレコードのように、パターンが最後に表示され、その行をファイルから削除しないでください。この行は、00000000000000 + 00000000000000 +パターンが位置75から104で発生した場合にのみ削除する必要があります。

ベストアンサー1

sedあなたのためのいくつかのヒント:

  1. while readファイルを繰り返すか内部的に使用することは、そのツールがとにかくファイルを1行ずつ処理するように設計されているため、sedほとんど意味がありません。awk

  2. のアドレス範囲sed '1,1d'が重複しています。単一行を処理するには、sed '1d'範囲を使用せずに処理できます。この場合、とにかく1行しかありませんが、削除された行がファイルにリダイレクトされるのはなぜですか?

  3. では、ファイル名にsed '1,1d' "$line"なる$lineと予想されます!

  4. だからあなたがしなければならないことは非常に簡単ですsed '/find the right regexp/d' $File

  5. 行の 75ff 位置にある指定された文字列と一致するパターンは/^.\{74\}00000000000000+00000000000000+/(つまり、行の先頭 ( ) ^、その後に任意の 74 文字およびパターンが続きます。

  6. 上記の\{number\}いくつかの重複項目を使用すると、次のように単純化できます。/^.\{74\}0\{14\}+0\{14\}+/

  7. これで、繰り返されるシーケンスをグループ化することでさらに簡素化できます。\(sequence\)\{2\)

バックスラッシュのエスケープを防ぐために拡張正規表現を使用すると、スクリプト全体を単純なコードに置き換えることができます。

sed -E '/^.{74}(0{14}\+){2}/d' $File

おすすめ記事