给出一个看起来像的文件:
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
以及引号之间只有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
个数字。
答案 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
e
e
(如果可能发生,则在下一行失败(在您的示例中不存在)