特定のレコードから先行ゼロを削除

特定のレコードから先行ゼロを削除

トレーラーレコードから前のゼロを削除するだけです。

 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|03

私はこれを行うことができます:

 sed -e 's/T|0*/T|/g' SampleFileName

トレーラーの後ろの先行ゼロを削除しましたが、それ以降はT|32.25削除しませんでした03

答え1

sedを使う

最後のフィールドのみを置き換えるには、正規表現を行末に固定する必要があります。

$ sed -Ee '/T/ s/[|]0*([[:digit:]]+)$/|\1/' SampleFileName
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|03

$行末でのみ一致します。 (オプション)/T/条件は交換を包含に制限しますT

上記はGNU sedでテストされていますが、BSD(OSX)sedでも動作してほしいです。

awkを使う

awk は行をフィールドに分割します。 awkを使用すると、$NF最後のフィールドでのみ置換(awk call)を実行できます。

$ awk -F'|' '/T/{sub(/^0+/,"",$NF)} 1' OFS='|' SampleFileName 
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|3

答え2

Perl を oneliner コマンドとして使用することもできます。たとえば、この問題には以下を使用できます。

 $ perl -p -e 'if (/^T/) { s/\|0*/\|/g } ' SampleFileName
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|32.25|3
 $  

正規表現でif行が文字で始まることを確認しT(この行がターゲット行であると仮定するため)、ブロック正規表現{ }|パイプの後ろのすべてのゼロを置き換えます。

答え3

別のPerlの説明:

perl -pe 's/\|0+(?=\d)/|/g if /^T\|/;'

上記はそれぞれとに翻訳されていますT|00|T|00.00|T|0|T|0.00|

関連情報