在Unix(OSX)中如何搜索/替换一堆文本文件
在Unix(OSX)中如何搜索/替换一堆文本文件
我有一个正则表达式,在http://regexpal.com/上成功测试过:
^(\".+?\"),\d.+?,"X",-99,-99,-99,-99,-99,-99,-99,(\d*),(\d*)
我的测试数据如下:
"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"
我想要用\1,\2,\3
替换每行的内容,例如第一行将变为
"AB101AA",394251,806376
我如何在osx中对我的文件夹中的所有csv文件运行此正则表达式的搜索和替换?我尝试使用sed,但它显示语法错误(而且我不确定它是否支持该正则表达式?)。此外,^(行的开头)和$(行的结尾)锚点会逐行工作,还是会匹配文件的开头和结尾?
更新:有一些关于使用cut、awk等从csv中获取特定字段的好回答,但我最近了解到我需要把这些数字拆分成两个子值,所以我上面的示例输出应该是这样的:
"AB101AA",3,94251,8,06376
据我所知,我需要使用正则表达式来实现这个功能。
在Unix(OSX)中,如何搜索/替换一组文本文件的问题出现的原因是,用户想要提取字段1、11和12的内容。为了解决这个问题,可以使用不同的方法。
首先是使用awk命令,通过指定字段分隔符为逗号(-F,),打印出字段1、11和12的内容。
awk -F, '{print $1, $11, $12}' input
另一种方法是使用cut命令,同样指定字段分隔符为逗号(-d,),然后选择字段1、11和12进行提取。
cut -d, -f1,11,12 input
还可以使用perl命令,通过使用-a参数打开自动拆分模式,将输入行自动拆分为数组,-F参数与-a一起使用,选择拆分行的分隔符。
perl -F, -lane 'printf "%s, %d, %d\n", $F[0], $F[10], $F[11]' input
最后是纯bash解决方案,通过设置IFS为逗号,使用循环读取输入的每一行,并通过数组索引提取字段1、11和12的内容。
#!/bin/bash IFS=, while read -ra ARRAY; do echo ${ARRAY[0]}, ${ARRAY[10]}, ${ARRAY[11]} done < input
感谢你的回答,我之前不知道awk和cut可以做这些操作。我刚刚发现我需要对我的数字字段进行拆分,所以我认为我需要使用正则表达式,但这些信息对我很有帮助。
在Unix(OSX)中搜索/替换一堆文本文件的原因是需要对大量的文本文件进行搜索和替换操作。解决方法是使用awk命令进行搜索和替换,并通过循环遍历文件列表来对每个文件进行操作。
首先,需要进入要搜索和替换文件的文件夹,使用cd folder
命令。
接下来,通过find
命令找到所有文件类型为csv的文件,并将文件列表保存至变量file
中。命令为for file in $(find . -type f -name '*.csv')
。
然后,对于每个文件,使用awk
命令进行搜索和替换操作。命令为awk -F"," '{printf("%s,%s,%s\n", $1, $11, $12)}' $file > /tmp/${file}.$$
。这个命令的作用是将文件中每一行的第1、11和12列提取出来,并将结果保存至临时文件/tmp/${file}.$$
中。
如果需要使用正则表达式进行搜索和替换操作,可以注释掉第一个awk命令,取消注释第二个awk命令。命令为#awk -F"," '/^(\".+?\"),[0-9]+?,"X",-99,-99,-99,-99,-99,-99,-99,([0-9]+),([0-9]+)/ {printf("%s,%s,%s\n", $1, $11, $12)}' $file > /tmp/${file}.$$
。
最后,如果测试通过,可以取消注释最后一行mv
命令,将临时文件/tmp/${file}.$$
移到原始文件中。命令为#mv /tmp/${file}.$$ ${file}
。
通过以上操作,可以在Unix(OSX)中实现搜索/替换一堆文本文件的需求。
在Unix(OSX)中搜索/替换一堆文本文件的问题是因为用户想要批量替换一组文本文件中的特定内容。下面是解决这个问题的方法:
方法一:
for file in *csv; do cp $file "${file}.bak && \ awk -F "," 'BEGIN OFS=","} {print $1,$11,$12}' ${file}.bak > ${file} done
方法二:
sed -i.bak 's/^\("[^"]+"\),\d\+,"X",-99,-99,-99,-99,-99,-99,-99,\([0-9]\+\),\([0-9]\+\)/\1,\2,\3/' FILE(S)
解决方法一中的问题:
sed 's/^\("[^"]+"\),[0-9]\+,"X",-99,-99,-99,-99,-99,-99,-99,\([0-9]\+\),\([0-9]\+\).*/\1,\2,\3/' <
输出:
"AB101AA",394251,806376 "AB101AF",394181,806429 "AB101AG",394251,806376 "AB101AH",394371,806359 "AB101AJ",394171,806398 "AB101AL",394331,806530
解决方法二中的问题:
sed -i.bak 's/^(\".+?\"),\d.+?,"X",-99,-99,-99,-99,-99,-99,-99,(\d*),(\d*)/\1,\2,\3/' dh.csv
输出:
sed: 1: "s/^(\".+?\") ...": \1 not defined in the RE
解决方法二中的问题:
sed 's/^\("[^"]+"\),\d\+,"X",-99,-99,-99,-99,-99,-99,-99,\([0-9]\+\),\([0-9]\+\).*/\1,\2,\3/'
输出:
"AB101AA",394251,806376 "AB101AF",394181,806429 "AB101AG",394251,806376 "AB101AH",394371,806359 "AB101AJ",394171,806398 "AB101AL",394331,806530
解决方法二中的问题:
sed -i.bak 's/^(\".+?\"),\d.+?,"X",-99,-99,-99,-99,-99,-99,-99,(\d*),(\d*)/\1,\2,\3/' dh.csv
输出:
sed: 1: "s/^(\".+?\"),\d. ...": unterminated substitute in regular expression
解决方法二中的问题:
sed -i.bak 's/^\("[^"]+"\),[0-9]\+,"X",-99,-99,-99,-99,-99,-99,-99,\([0-9]\+\),\([0-9]\+\).*/\1,\2,\3/' dh.csv
输出:
"AB101AA",394251,806376 "AB101AF",394181,806429 "AB101AG",394251,806376 "AB101AH",394371,806359 "AB101AJ",394171,806398 "AB101AL",394331,806530
最后,参考这个链接以了解OSX和GNU Linux之间的sed差异:[variations of sed between osx and gnu linux](http://stackoverflow.com/questions/2320564)