我已经看过了SO并发现了许多相似的东西,但这并不复杂,我似乎无法到达那里...... 我正在研究csv文本操作以自动执行任务。 我需要用沟通取代沟通 - 表达自己; 但是当字符串Sports Communication出现时,我不希望改变它。我认为它接近
sed -i.bak "s/[Sports]! Communication,/Communication - articulating one\'s self;/g" out.csv
我会使用awk解决方案,但更熟悉sed在bash文件中,所以任何常见的命令行解决方案都会很棒
unassigned,2.5,"Sports Communication,","The Campus...lots of other data...will be required.",Communication,Collaboration,Brand
可以使用Collaboration或Brand切换通信,也可以不使用
答案 0 :(得分:3)
您可以使用Awk
语句,
awk -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file
为输入文件生成如下输出
unassigned 2.5 "Sports Communication " "The Campus...lots of other data...will be required." Communication - articulating one's self; Collaboration Brand
在最新的GNU Awk中(自4.1.0 released起),它可以选择"inplace" file editing:
[...]使用新工具构建的“inplace”扩展可用于模拟GNU“
sed -i
”功能。 [...]
并使用扩展名保留文件的备份
gawk -i inplace -v INPLACE_SUFFIX=.bak -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file
(或)对于旧版本,只需使用临时文件并将其交换回来,
awk -F\, '{for(i=1;i<=NF;i++) { if(match($i,/^Communication$/)) {gsub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }}1' file > temp && mv temp > file
基于以下唯一的Ed Morton评论进行一级简化,直接进行替换并避免不必要的match()
,
awk -F\, '{for(i=1;i<=NF;i++) {sub(/^Communication$/,"Communication - articulating one\047s self;",$i);} }1' file
答案 1 :(得分:1)
sed 方法:
#!/bin/sh
xvfb-run -a -s "-screen 0 1024x768x16" wkhtmltopdf $*
awk 方法:
sed "s/\(,Communication\),/\1 - articulating one's self;,/g" file