我需要一些关于如何通过搜索符号匹配列表来替换/修改 csv 第二列中的字符串的建议。
这是我的 file.csv
[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12.18.l,ch17,12.1
2,yo11`18.p,ch18,13.5
3,qk13_18.q,ch19,22.6
4,ls15-18.r,ch20,23.7
5,ew16'18.s,ch21,24.9
运行 sed/awk 后,预期结果如下
[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12_18_l,ch17,12.1
2,yo11_18_p,ch18,13.5
3,qk13_18_q,ch19,22.6
4,ls15-18_r,ch20,23.7
5,ew16_18_s,ch21,24.9
如果搜索匹配-
并且_
不执行任何操作。如果搜索匹配,则,
<
`
'
需要使用下划线符号进行替换:_
。
我尝试使用一些组合awk
,但这不起作用。
awk -F, -v OFS=, 'sub(/\.\`\>\'/,"_",$2)+1' file.csv
任何想法表示赞赏
答案1
编辑:
由于OP编辑了数据。最好awk
现在使用而不是sed
.
awk 'BEGIN{FS=OFS=","}/^[0-9]+,/{gsub(/[\.<`\x27]/,"_",$2);print;next}1' file.csv
答案2
和perl
:
perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e' -- "$file"
将行开头 ( ) 后面的除( )+
以外的一个或多个 ( ) 字符 以及一个或多个 ( )十进制数字和一个(重置匹配的开头)替换为除除 ( ) 之外的任何字符时的相同 ( ) ord字符(数字或下划线)或替换为.,
[^,]
^
+
\d
\d
,
\K
$&
\w
-
_
因此,实际上,如果第一个字段完全由十进制数字组成,我们将替换除 alnum 之外的字符,_
并在第二个字段中替换字符。-
要将匹配限制为文件中的特定表,您可以:
perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e if
/^SL,Name/ .. /^\[/' -- "$file"
我们只在以 开头的行SL,Name
和以 开头的下一行之间进行这些替换[
。
使用 就地编辑文件-i
,-p
适用于为文件的每一行评估表达式的sed
模式(该行存储在 中,默认变量起作用,相当于-e
$_
s/pattern/replacement/flags
模式空间在sed
)。