使用文本文件中的awk,sed或perl这样的短命令行替换冒号后的特定值

时间:2014-12-10 16:53:19

标签: regex bash perl awk sed

我试过看了很多问题,但我仍然无法为此创建一些awk命令。基本上我有一个带空格缩进的文件(不是制表符),我只想更改值“[scrub]”的字段价格,数量和符号的值。如何使用单行命令维护文件的格式和其他值?

自:

Values:
    Client Order ID                   : new000000000001
        Client Quote ID                   : N/A
        Exchange Quote ID                 : N/A
        Symbol                            : EUR/USD
      Spot attributes
        Price                             : $150.00000000 : 15000000000
        Discretion                        : $0.00000000 : 0
        Quantity                          : 100

要:

Values:
    Client Order ID                   : new000000000001
        Client Quote ID                   : N/A
        Exchange Quote ID                 : N/A
        Symbol                            : [scrub]
      Spot attributes
        Price                             : [scrub]
        Discretion                        : $0.00000000 : 0
        Quantity                          : [scrub]

提前致谢!

2 个答案:

答案 0 :(得分:1)

仅为price使用,例如:

$ perl -pe 's/^(\s+Price\s+:\s+).*/$1\[scrub\]/g' prices
Values:
    Client Order ID                   : new000000000001
        Client Quote ID                   : N/A
        Exchange Quote ID                 : N/A
        Symbol                            : EUR/USD
      Spot attributes
        Price                             : [scrub]
        Discretion                        : $0.00000000 : 0
        Quantity 

其余的:

$ perl -pe '
    s/^(\s+Price\s+:\s+).*/$1\[scrub\]/g;
    s/^(\s+Symbol\s+:\s+).*/$1\[scrub\]/g;
    s/^(\s+Quantity\s+:\s+).*/$1\[scrub\]/g;
' file

答案 1 :(得分:0)

最后我创建了一个脚本,因为命令太大了。我只是为了获取信息而放在这里:

#!/usr/bin/env perl
use strict;
use warnings;
open INPUTFILE, "<", $ARGV[0] or die $!;
open OUTPUTFILE, ">", $ARGV[1] or die $!;
while (<INPUTFILE>) {
  s/^(\s+Price\s+:\s+).*/$1\[scrub\]/g;
  s/^(\s+Symbol\s+:\s+).*/$1\[scrub\]/g;
  s/^(\s+Quantity\s+:\s+).*/$1\[scrub\]/g;
  s/^(\s+FIX content drop copy only\s+:\s+).*/$1\[scrub\]/g;
  print OUTPUTFILE;
}
close OUTPUTFILE;
close INPUTFILE;