2

JavaScriptコードをJavaに移植しようとしています。その際、一重引用符で囲まれたすべての文字列を二重引用符で囲まれた文字列に置き換える必要があります。これには、二重引用符をエスケープされた二重引用符に置き換えることも必要です。しかし、一重引用符で囲まれた文字列ブロック内の引用符だけをエスケープしたいのです。

次の sed コマンドを使用して、引用符で囲まれた文字列を問題なく置き換えることができます。

sed "s/'\([^']*\)'/\"\1\"/g"

これにより、単一引用符で囲まれた文字列が二重引用符で囲まれた文字列に正常に変更されます。しかし、内部の二重引用符をエスケープする必要があります。最も簡単な方法は、行のセクションで正規表現置換を実行する方法を sed が提供した場合です。しかし、それが可能かどうかはわかりません。

4

3 に答える 3

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、元のファイルを変更しません。

于 2012-07-30T07:22:58.113 に答える
1

sedPOSIX正規表現エンジンはルックアラウンドを知らないため、それを行うことはできないと思います。ただし、(たとえば) Python スクリプトでは、操作を 2 つのステップに分割することで可能になります。

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)
于 2012-07-30T06:08:03.887 に答える
0

入力がそれほど複雑でない場合、これは機能するはずです。

 sed ": loop s/\('[^']*[^\\]\)\"/\1\\\\\"/;t loop;s/'/\"/g" input_file
于 2012-07-31T10:00:23.570 に答える