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

时间:2015-05-26 19:04:15

标签: 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

什么sedawk脚本会替换引号之间的所有e以及引号之间只有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个数字。

3 个答案:

答案 0 :(得分:3)

$ 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

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;s/^([^"]*("[^"e]*"[^"]*)*"[^"e]*)e/\1@#$/;ta' file

这个正则表达式从行的开头看起来是一系列非双引号字符,后跟一对可能的双引号,其中没有e个,其次是另一个可能的非双重系列引用字符,后跟双引号和可能的非双引号系列。如果下一个模式是e,它会替换\1(这是e之前的所有内容)和@#$的模式。如果替换成功,即ta,则重复该过程,直到不再发生替换为止。

N.B。这适用于具有多对双引号字符串的行。

答案 2 :(得分:0)

sed ':cycle
s/^\(\([^"]*\("[^"]*"\)*\)*"[^"]*\)e/\1@#$/
t cycle' YourFile
  • Posix版本
  • 前排至第一位e
  • 同时更改未关闭的引用字符串中的任何e(如果可能发生,则在下一行失败(在您的示例中不存在)