0

私のファイルは次のようになります。

invoice;123;456
invoice;789;012
total;912;468

「最初のフィールドが「合計」で始まる場合、3番目のフィールドにゼロを入れる」必要があるため、次のようになります。

invoice;123;456
invoice;789;012
total;912;0

私は sed sintax に精通していますが、フィールドを使用することは私の可能性にはほど遠いものです。おそらく awk の方が便利です...

ありがとう!

4

3 に答える 3

4
awk  'BEGIN {FS = ";"; OFS=";"; } $1 ~ /^total/ { $3 = 0 } 1'

FSは入力フィールド セパレータ、OFSは出力フィールド セパレータです。

$1totalは最初のフィールドです。それが;で始まるかどうかを確認します。その場合、3 番目のフィールドを 0 に設定します。

1は常に true で、行が印刷されます。

于 2013-05-10T19:14:26.370 に答える
2

シードソリューション

sed -e 's/\(total;[0-9]\+;\)[0-9]*\(;*\)/\10\2/g' <file>

の代わりに-e-iファイル自体を変更します。

の最初のセット内にあるものはすべて、\(...)\実際には最初のフィールドであり、 で置き換えられます\1。次に[0-9]*任意の数値であり、 で置き換えられます0。最後に\(;*\)、他のフィールドが存在する場合は、それを の代わりに配置します。\2

于 2013-05-10T19:30:23.810 に答える
1

ここにsed解決策があります

sed -i 's/\(^total;.*;\)\(.*\)/\10/g' file

(^total;.*;)(.*) -> (First group matches until the second semicolon)(Second group matches rest)
\10 -> Replacement is \1 (first group) + 0 (zero)
于 2013-05-10T19:30:22.597 に答える