我正在尝试将javascript代码移植到Java。这样做,我需要用双引号字符串替换所有单引号字符串。这也要求我用转义双引号替换双引号。但我只想在单引号字符串块中转义引号。
我可以使用以下sed命令替换引用的字符串:
sed "s/'\([^']*\)'/\"\1\"/g"
这会成功将单引号字符串修改为双引号字符串。但我还是要逃避内部的双引号。最简单的方法似乎是,如果sed提供了一种方法,可以在一行的一部分上运行正则表达式替换。但我不知道这是否可能。
答案 0 :(得分:1)
我认为你不能用sed
做到这一点,因为它的POSIX正则表达式引擎不知道外观。但是(例如)Python脚本可以通过将操作分成两个步骤来实现:
import re
with open("myfile.js") as infile, open("myfile.jsconv", "w") as outfile:
for line in infile:
line = line.sub(
r"""(?x)" # Match a double quote
(?= # only if it's followed by:
(?: # an even number of quotes, defined like this:
(?: # Either...
\\. # any escaped character
| # or
[^'\\] # a character except single quotes
)* # repeated as needed, followed by
' # a single quote.
(?:\\.|[^'\\])* # (Repeat this to ensure an even
' # number of quotes)
)* # Do this zero or more times.
(?:\\.|[^'\\])* # Then match any remaining characters
$ # until the end of the line.
) # End of loohahead""",
'\\"', line)
line = re.sub(
r"""(?x)' # Match a single quote
( # Match and capture
(?: # either...
\\. # an escaped character
| # or
[^'\\] # a character besides quotes or backslashes
)* # any number of times.
) # End of capturing group number 1
' # Match a single quote""",
r'"\1"', line)
outfile.write(line)
答案 1 :(得分:1)
这可能适合你(GNU sed):
sed '/'\''[^'\'']*'\''/!b;s//\n&\n/g;ba;:a;/\n\n/bb;s/\n['\'']/"\n/;ta;s/\n"/\\"\n/;ta;s/\n\([^'\''"]\+\)/\1\n/;ta;:b;s/\n\n//;ta' file
但是,如果引用的字符串可以是多行,则需要稍微不同(但较慢)的方法:
sed ':a;$!{N;ba};/\x00/q1;s/'\''[^'\'']*'\''/\x00&\x00/g;bb;:b;/\x00\x00/bc;s/\x00['\'']/"\x00/;tb;s/\x00"/\\"\x00/;tb;s/\x00\([^'\''"]\+\)/\1\x00/;tb;:c;s/\x00\x00//;tb' file
这会将整个文件拖入模式空间,然后使用\x00
作为标记来分隔引用的字符串。它首先检查文件中是否已存在\x00
,如果确实存在退出代码1
,则保留原始文件。
答案 2 :(得分:0)
如果输入不是很复杂,这应该有效:
sed ": loop s/\('[^']*[^\\]\)\"/\1\\\\\"/;t loop;s/'/\"/g" input_file