UNIXでフィールド列の値を見つけて置き換える方法

UNIXでフィールド列の値を見つけて置き換える方法

値が次のように区切られたファイルがあります。|

123-|aaa|bbb|123|123.0|123-|123.01-|-123.02|123.03-|aaa|bbb|123-|aaa-|-bbb|cc-cc|123.04-|aa123-|123.05-

で終わる列の値を選択する必要があります-。選択した列は数字でなければならず、それは-その値の先頭に移動します。

答え1

POSIX的に:

sed ':1
     s/^\(.*|\)\{0,1\}\([0-9.]*[0-9][0-9.]*\)-\(|.*\)\{0,1\}$/\1-\2\3/
     t1'

または awkより直感的な方法で:

awk -F '|' -v 'OFS=|' '{
  for (i = 1; i <= NF; i++)
    if ($i ~ /^[0-9]*(\.[0-9]+)?-$/)
      $i = "-" substr($i, 1, length($i)-1)
  print}'

(このバージョンはより厳格であり、次のように見なされます。数字、例えば、そのsed人は数字として受け入れられます)。1...2

ご意見に基づき、以下の事項をお知らせいたしました。

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05

答え2

一致を行の先頭または区切り文字に固定します。たとえば、GNU sedを使用して正規表現を拡張すると、次のようになります。

sed -r ':a; s/(^|\|)([0-9.]+)-(\||$)/\1-\2\3/; ta' infile

出力:

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05

関連情報