使用sed命令查找和替换

时间:2018-04-20 20:43:51

标签: regex linux unix awk sed

我希望在双引号之间找到单引号',并使用sed命令将其替换为(反斜杠单引号单引号)\' '

input = 'gender':"Men's",'colour':'Red','name':"Men's levi's"

output = 'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"

我试过这个,我可以用管道替换逗号但是当试图用\' '替换单引号时,它不起作用:

sed 's/(\"[^"\'']\{1,\}),([^"\'']\{1,\}\")/\1 | \2/g' test.csv

3 个答案:

答案 0 :(得分:3)

以下是使用awk

执行此操作的方法
awk 'BEGIN{FS=OFS=","} {
  for (i=1; i<=NF; i++)
     if (split($i, a, / *: */) == 2 && a[2] ~ /^"/) {
        gsub("\047",  "\\\047 \047", a[2])
        $i=a[1] ":" a[2]
     }
} 1' file

'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"

答案 1 :(得分:3)

使用GNU awk进行多字符RS和RT,您只需要:

$ awk -v RS='"[^"]+"' '{gsub(/\047/,"\\\047 \047",RT); ORS=RT} 1' file
'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"

答案 2 :(得分:0)

使用sed,你可以这样做:

sed -e ":a"
    -e "s/'\([^\\\":]*\(\\.[^\\\":]*\)*\"\)/\\\\\f \f\1/"
    -e "ta"
    -e "s/\\\\\f \f/\\\' '/g" file

换行符和缩进是为了便于阅读。重点是您首先匹配后跟双引号的单引号(可能不会立即匹配),将其替换为\\\f \f\\字面反斜杠,\f表单Feed )使用循环(t)执行相同的操作,然后使用所需的字符串替换先前的替换。主正则表达式也会使用双引号字符串中的转义双引号进行处理,但如果其中包含冒号:或逗号,则会失败。

一衬垫:

sed -e ":a" -e "s/'\([^\\\":]*\(\\.[^\\\":]*\)*\"\)/\\\\\f \f\1/" -e "ta" -e "s/\\\\\f \f/\\\' '/g" file