如何使用 grep 更改列

How to use grep to change a column

提前致谢。 我有一个巨大的数据库,其中所有行都是这样开始的:

(497, 36390, 495, 88, 89, 2, 'xxdurango/a-...

(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 命令 select 行中的其他值。

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

需要搜索: 行首,+ numeral1 (,) numeral2(,)

或者类似的东西: 行首,三位数字 (,) 四位数字 (,)

有什么提示吗?

谢谢

使用grep只能显示与你想要的模式相匹配的行,所以你要么全有要么全无,你不会得到你需要的字段分隔。还有其他工具可以使这变得容易得多,例如 sed,它使用类似的正则表达式但可以编辑流(它的名称是 Stream Editor 的缩写. 作为示例,以下将第三个字段更改为 YYYY:

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

命令分解如下:

  • -r 开启扩展正则表达式
  • s/ 是搜索和替换命令的开始
  • ^ 将搜索锚定在行首
  • (开始分组,我们稍后会提到
  • \( 是行首的字面左括号
  • ([^,]+,) 读作一个或多个不是逗号后跟逗号的字符,并视为一个单位
  • {2}表示前面的单元重复了两次
  • ) 将整个形态收尾到此为一组,后面会提到
  • [^,]+, 同上,非逗号后跟逗号
  • / 标记从搜索模式到替换的变化
  • </code> 替换为模式中的第一组 space(第二个逗号之前的所有内容)</li> <li><code>YYYY 是我们的文字替换
  • /p 结束替换模式并说打印出变化

使用 awk 这样的东西会更容易:

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

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

另一种选择是使用 cutpaste,但我会把它留作练习。