sed或awk匹配部分字符串

时间:2017-04-04 15:47:58

标签: bash awk sed

我已经看过了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切换通信,也可以不使用

2 个答案:

答案 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