使用sed或awk时,如何替换引号之间出现的所有字符串?

使用sed或awk时,如何替换引号之间出现的所有字符串?,awk,sed,Awk,Sed,给定一个如下所示的文件: some text no replace "text in quotes" no replace more text no replace "more text in quotes" no replace even more text no replace "even more text in quotes" no replace etc 什么sed或awk脚本将替换引号之间的所有es,而引号之间仅替换es,从而生成如下内容: some text no replace

给定一个如下所示的文件:

some text
no replace "text in quotes" no replace
more text
no replace "more text in quotes" no replace
even more text
no replace "even more text in quotes" no replace
etc
什么
sed
awk
脚本将替换引号之间的所有
e
s,而引号之间仅替换
e
s,从而生成如下内容:

some text
no replace "t@#$xt in quot@#$s" no replace
more text
no replace "mor@#$ t@#$xt in quot@#$s" no replace
even more text
no replace "@#$v@#$n mor@#$ t@#$xt in quot@#$s" no replace
etc
引号之间可以有任何数字
e
s

$ awk 'BEGIN{FS=OFS="\""} {gsub(/e/,"@#$",$2)} 1' file
some text
no replace "t@#$xt in quot@#$s" no replace
more text
no replace "mor@#$ t@#$xt in quot@#$s" no replace
even more text
no replace "@#$v@#$n mor@#$ t@#$xt in quot@#$s" no replace
etc

还考虑一行上的多对引号:

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {gsub(/e/,"@#$",$2)} 1'
aebec"@#$d@#$@#$@#$"fegeh"eieje"kelem

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {for (i=2;i<=NF;i+=2) gsub(/e/,"@#$",$i)} 1'
aebec"@#$d@#$@#$@#$"fegeh"@#$i@#$j@#$"kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”}{gsub(/e/,“@#$,$2)}1'
aebec“@#$d@#$@#$$@#$$”fegeh“eieje”kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”“}{for(i=2;i

还考虑一行上的多对引号:

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {gsub(/e/,"@#$",$2)} 1'
aebec"@#$d@#$@#$@#$"fegeh"eieje"kelem

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {for (i=2;i<=NF;i+=2) gsub(/e/,"@#$",$i)} 1'
aebec"@#$d@#$@#$@#$"fegeh"@#$i@#$j@#$"kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”}{gsub(/e/,“@#$,$2)}1'
aebec“@#$d@#$@#$$@#$$”fegeh“eieje”kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”“}{for(i=2;i

还考虑一行上的多对引号:

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {gsub(/e/,"@#$",$2)} 1'
aebec"@#$d@#$@#$@#$"fegeh"eieje"kelem

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {for (i=2;i<=NF;i+=2) gsub(/e/,"@#$",$i)} 1'
aebec"@#$d@#$@#$@#$"fegeh"@#$i@#$j@#$"kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”}{gsub(/e/,“@#$,$2)}1'
aebec“@#$d@#$@#$$@#$$”fegeh“eieje”kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”“}{for(i=2;i

还考虑一行上的多对引号:

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {gsub(/e/,"@#$",$2)} 1'
aebec"@#$d@#$@#$@#$"fegeh"eieje"kelem

$ echo 'aebec"edeee"fegeh"eieje"kelem' |
    awk 'BEGIN{FS=OFS="\""} {for (i=2;i<=NF;i+=2) gsub(/e/,"@#$",$i)} 1'
aebec"@#$d@#$@#$@#$"fegeh"@#$i@#$j@#$"kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”}{gsub(/e/,“@#$,$2)}1'
aebec“@#$d@#$@#$$@#$$”fegeh“eieje”kelem
$echo'aebec“edeee”fegeh“eieje”kelem'|
awk'BEGIN{FS=OFS=“\”}{for(i=2;i这可能适合您(GNU-sed):

这个正则表达式从行首开始查找一系列非双引号字符,后跟一对可能的双引号,其中没有
e
,后跟另一系列可能的非双引号字符,后跟一个双引号和一系列可能的非双引号。如果下一个模式是
e
它用
\1
@$
替换模式。如果替换成功,即
ta
,则重复该过程,直到不再发生替换

注意:这适用于具有多对双引号字符串的行。

这可能适用于您(GNU-sed):

sed ':cycle
s/^\(\([^"]*\("[^"]*"\)*\)*"[^"]*\)e/\1@#$/
t cycle' YourFile
这个正则表达式从行首开始查找一系列非双引号字符,后跟一对可能的双引号,其中没有
e
,后跟另一系列可能的非双引号字符,后跟一个双引号和一系列可能的非双引号。如果下一个模式是
e
它用
\1
@$
替换模式。如果替换成功,即
ta
,则重复该过程,直到不再发生替换

注意:这适用于具有多对双引号字符串的行。

这可能适用于您(GNU-sed):

sed ':cycle
s/^\(\([^"]*\("[^"]*"\)*\)*"[^"]*\)e/\1@#$/
t cycle' YourFile
这个正则表达式从行首开始查找一系列非双引号字符,后跟一对可能的双引号,其中没有
e
,后跟另一系列可能的非双引号字符,后跟一个双引号和一系列可能的非双引号。如果下一个模式是
e
它用
\1
@$
替换模式。如果替换成功,即
ta
,则重复该过程,直到不再发生替换

注意:这适用于具有多对双引号字符串的行。

这可能适用于您(GNU-sed):

sed ':cycle
s/^\(\([^"]*\("[^"]*"\)*\)*"[^"]*\)e/\1@#$/
t cycle' YourFile
这个正则表达式从行首开始查找一系列非双引号字符,后跟一对可能的双引号,其中没有
e
,后跟另一系列可能的非双引号字符,后跟一个双引号和一系列可能的非双引号。如果下一个模式是
e
它用
\1
@$
替换模式。如果替换成功,即
ta
,则重复该过程,直到不再发生替换

注意:这适用于具有多对双引号字符串的行

sed ':cycle
s/^\(\([^"]*\("[^"]*"\)*\)*"[^"]*\)e/\1@#$/
t cycle' YourFile
  • Posix版本
  • 从最前面到最前面
    e
  • 同时更改未关闭的带引号字符串中的任何
    e
    (在结尾处,如果可能发生,则在下一行中失败)(不在您的示例中)
  • Posix版本
  • 从最前面到最前面
    e
  • 同时更改未关闭的带引号字符串中的任何
    e
    (在结尾处,如果可能发生,则在下一行中失败)(不在您的示例中)
  • Posix版本
  • 从最前面到最前面
    e
  • 同时更改未关闭的带引号字符串中的任何
    e
    (在结尾处,如果可能发生,则在下一行中失败)(不在您的示例中)
  • Posix版本
  • 从最前面到最前面
    e
  • 同时更改未关闭的带引号字符串中的任何
    e
    (在结尾处,如果可能发生,则在下一行中失败)(不在您的示例中)

对不起,我忘了同一行上有一些文本不应该被替换。我修改了问题。对不起,我忘了同一行上有一些文本不应该被替换。我修改了问题。对不起,我忘了同一行上有一些文本不应该被替换。我修改了问题。对不起,我忘了有这么多我在同一行上发了不应该被替换的文本。我已经修改了问题。