Regex 使用sed命令查找和替换

Regex 使用sed命令查找和替换,regex,linux,unix,awk,sed,Regex,Linux,Unix,Awk,Sed,我想在双引号之间找到单引号”,并使用sed命令将其替换为(反斜杠单引号)\' 输入=“性别”:“男式”;“颜色”:“红色”;“姓名”:“男式李维斯” 输出=“性别”:“男性”;“颜色”:“红色”;“姓名”:“男性”; 我尝试用管道替换逗号,但尝试用\''替换单引号时,它不起作用: sed 's/(\"[^"\'']\{1,\}),([^"\'']\{1,\}\")/\1 | \2/g' test.csv 下面是一种使用awk的方法: awk 'BEGIN{FS=OFS=","} { for

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

输入=
“性别”:“男式”;“颜色”:“红色”;“姓名”:“男式李维斯”

输出=
“性别”:“男性”;“颜色”:“红色”;“姓名”:“男性”;

我尝试用管道替换逗号,但尝试用
\''
替换单引号时,它不起作用:

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

下面是一种使用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

使用
sed
可以执行以下操作:

sed -e ":a"
    -e "s/'\([^\\\":]*\(\\.[^\\\":]*\)*\"\)/\\\\\f \f\1/"
    -e "ta"
    -e "s/\\\\\f \f/\\\' '/g" file
换行符和缩进是为了可读性。关键是,首先匹配后跟双引号的单引号(可能不会立即匹配),将其替换为
\\\f\f
\\\
一个文本反斜杠,
\f
表单提要)使用循环(
t
)执行相同的操作,然后用所需字符串替换之前的替换。主正则表达式还注意双引号字符串中的转义双引号,但如果其中有冒号
或逗号
,则它会失败

一艘班轮:

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

使用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"

你介意展示一下你的努力吗?@revo我试过用管道代替逗号,但当我尝试用sed的/(\“[^”\''''\{1,\}),([^“\''\{1,\}')/\1 \\\\\\\\\\\ 2/g'test.csv替换单引号时,它不起作用。我对sed是新手,所以我真的不知道如何用正确的方式来做。我已经回答了你的问题,希望这能有所帮助。老实说,你的问题标题有点模糊,但我这么说只是为了避免那些可怕的“否决票”,如果这对你很重要的话。祝塞德好运!还有另一个称为Unix和Linux的堆栈社区。你的问题可能更适合这里?在标记中添加
awk
并不是一个好主意,因为OP明确表示
sed
无处不在。@johnny_moss这并不意味着其他相关的答案帮不上忙@雷沃:当然。但是OP指定了sed,这就是我的观点。你可以用多种方式回答这个问题。我只是想遵守论坛的协议;我很欣赏他们的特殊性。@anubhava非常感谢你的解决方案是有效的,尽管我一直在寻找sed命令,但我很欣赏你的努力。@johnny_moss人们在他们的问题中会问各种古怪的事情,这通常意味着他们只知道这些,这也不是不建议一个可能更好的方法的理由。经济不是一个因素吗?难道不是最短、最有效的解决办法吗?有什么回答吗?@revo非常感谢,这对我很有帮助@johnny_moss我不会为了一个更短、不精确的解决方案而牺牲精度。若答案并没有涵盖真实的案例,那个么它是否简短也无关紧要。简单地说,这不是一个答案。我不确定你说的经济不是一个因素吗?但就性能而言,除了精度之外,这并不忽视性能。
$ awk -v RS='"[^"]+"' '{gsub(/\047/,"\\\047 \047",RT); ORS=RT} 1' file
'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"