如何使用 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 使用的输出字段分隔符也是如此.请注意,我们只是使用逗号来分隔字段,因此第一个字段将包含左括号。由于您只想更改第三个字段,因此这不是问题。如果您想更改第一个字段,则需要考虑到这一点。
另一种选择是使用 cut
和 paste
,但我会把它留作练习。
提前致谢。 我有一个巨大的数据库,其中所有行都是这样开始的:
(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 使用的输出字段分隔符也是如此.请注意,我们只是使用逗号来分隔字段,因此第一个字段将包含左括号。由于您只想更改第三个字段,因此这不是问题。如果您想更改第一个字段,则需要考虑到这一点。
另一种选择是使用 cut
和 paste
,但我会把它留作练习。