2017-04-05 62 views
-2

并提前致谢。 我有一个庞大的数据库,其中所有行开始这样的:如何使用grep更改列

(497,36390,495,88,89,如图2所示,“xxdurango /一个-...

(498,36391,1,93 ,100,1, 'xxsalamanca ...

(499,36392,498,94,95,如图2所示,' xxsalamanca/NotI位...

(500,36393,498,96,97,2 ,'xxsalama ...

(501,36394,1,101,108,1,'xxg ...

我需要后(#,#改为第三列,

我想用grep <,。,> <(。,。,>

这一切的grep命令选择其它行中的值。

我想进行搜索和替换(使用BBEdit),所有第三列需要更改为相同的值。

需要搜索: begining线,+ numeral1(,)numeral2(,)

或者类似的东西: begining线,3digit号(,)四位数(,)

任何提示?

感谢

+0

* <.,.,><(.,.,> * - 哪里是在你输入尖括号?更新您的输入并显示预期结果 – RomanPerekhrest

回答

0

采用grep只能说明匹配你想要的图案,让你获得全有或全无的线,你不会得到你需要的字段的分离。还有其他一些工具可以使这一切变得更加容易,例如sed,它使用类似的正则表达式,但可以编辑流(其名称是Stream Editor的缩写。作为一个例子,下面将第三字段更改为YYYY:

sed -r 's/^(\(([^,]+,){2})[^,]+,/\1 YYYY,/p' input_filename 

的命令细分如下:

  • -r打开扩展正则表达式
  • s/是搜索的开始并替换命令
  • ^锚点在行首开始搜索
  • ( b egins分组,我们将参照后
  • \(位于行
  • ([^,]+,)读取是,不逗号,后跟一个逗号一个或多个字符的开始字面开口托架,和治疗作为单个单元
  • {2}说,以前的单元重复两次
  • )关闭整个图案到该点作为一组被称为后
  • [^,]+,是与上述相同的,非逗号后跟一个逗号
  • /标记从搜索模式到替换
  • \1由第一组中的图案空间置换(一切直至第二逗号)
  • YYYY是我们的文字置换
  • /p变化结束该替换模式并说打印出来的变化

使用类似awk会更容易:

awk -F, '{OFS=","; $3="YYYY"; print}' input_filename 

这应该是非常明显的如何工作,您可能只需知道-F,将输入字段分隔符设置为,OFS=","对print所使用的输出字段分隔符也是如此。请注意,我们只是使用逗号来分隔字段,所以第一个字段将包含左括号。由于您只想更改第三个字段,因此这不是问题。如果你想改变第一个领域,你需要考虑到这一点。

另一种选择是使用cutpaste,但我会离开,作为一个练习。