如何在unix(osx)中搜索/替换一堆文本文件

Mat*_*rts 4 regex unix macos replace sed

我有一个正则表达式,我在http://regexpal.com/上成功测试过:

^(\".+?\"),\d.+?,"X",-99,-99,-99,-99,-99,-99,-99,(\d*),(\d*)
Run Code Online (Sandbox Code Playgroud)

我的测试数据如下:

"AB101AA",10,"X",-99,-99,-99,-99,-99,-99,-99,394251,806376,179,"S00","SN9","00","QA","MH","X"
"AB101AF",10,"X",-99,-99,-99,-99,-99,-99,-99,394181,806429,179,"S00","SN9","00","QA","MH","X"
"AB101AG",10,"X",-99,-99,-99,-99,-99,-99,-99,394251,806376,179,"S00","SN9","00","QA","MH","X"
"AB101AH",10,"X",-99,-99,-99,-99,-99,-99,-99,394371,806359,179,"S00","SN9","00","QA","MH","X"
"AB101AJ",10,"X",-99,-99,-99,-99,-99,-99,-99,394171,806398,179,"S00","SN9","00","QA","MH","X"
"AB101AL",10,"X",-99,-99,-99,-99,-99,-99,-99,394331,806530,179,"S00","SN9","00","QA","MH","X"
Run Code Online (Sandbox Code Playgroud)

我想\1,\2,\3在每一行上替换它,所以例如第1行会给出

"AB101AA",394251,806376
Run Code Online (Sandbox Code Playgroud)

如何运行此正则表达式搜索并替换osx中我的文件夹中的所有csv文件?我尝试使用sed,但抱怨语法错误(加上我不确定它会支持这个正则表达式吗?).另外,^(行的开头)和$(行尾)锚点会逐行工作,还是会匹配文件的开头和结尾?

更新:一些很好的响应有cut,awk等从csv获取特定字段,但我最近了解到我需要从该列表中取出数字并将它们分成2个子值,所以我的上面的示例输出需要看起来像:

"AB101AA",3,94251,8,06376
Run Code Online (Sandbox Code Playgroud)

据我所知,我需要使用正则表达式.

Fre*_*ihl 5

您想提取字段1,11和12?对于像这样的任务,awk或者cut真的超级棒!例如

awk -F, '{print $1, $11, $12}' input
Run Code Online (Sandbox Code Playgroud)

使用cut:

cut -d, -f1,11,12 input 
Run Code Online (Sandbox Code Playgroud)

使用perl.-a打开autosplit模式 - perl会自动将空格上的输入行拆分到@F数组中.-F与-a一起使用,以选择要分割线的分隔符.

perl -F, -lane 'printf "%s, %d, %d\n", $F[0], $F[10], $F[11]' input 
Run Code Online (Sandbox Code Playgroud)

......最后,一个纯粹的bash解决方案

#!/bin/bash
IFS=,
while read -ra ARRAY;
do
    echo ${ARRAY[0]}, ${ARRAY[10]}, ${ARRAY[11]}
done < input
Run Code Online (Sandbox Code Playgroud)