内部引用符をフィルタリングする方法は? [閉鎖]

内部引用符をフィルタリングする方法は? [閉鎖]

フィルタリングは可能ですか?つまり、内部引用符の前にESCを入れることは可能ですか?sedアッそれとも他の* NIXツール(perl / pythonを除く)?

はい(修正済み):

$ echo label=\"123 \"456\" 789\" \"AB C\" e f gh | magic-filter
label="123 \"456\" 789\" \"AB C" e f gh

tag="123\"456\"789""AB C"

つまり、最初と最後に基づいてフィルタリングするフィルタが必要です。charはそのまま渡されますが、他のすべての項目はに置き換えられます\続いて

答え1

GNU sed、サポート特定の数のすべての項目を置き換える

$ echo label=\"123 \"456\" 789\" \"AB C\" e f gh | 
    sed -E 's/"/\\"/2g; s/\\("[^"]*)$/\1/'
label="123 \"456\" 789\" \"AB C" e f gh

すべて"(最初のものを除く")はに置き換えられ、最後から\"削除\されます。\"


GNU sed利用できない場合は、\最初の項目からも削除してください。\"

$ echo label=\"123 \"456\" 789\" \"AB C\" e f gh | 
    sed -E 's/"/\\"/g; s/\\"/"/; s/\\("[^"]*)$/\1/'
label="123 \"456\" 789\" \"AB C" e f gh

注:一部のバージョンでは代わりにsed必要な場合があります。-r-E


そしてperl

$ echo label=\"123 \"456\" 789\" \"AB C\" e f gh | 
    perl -pe 's/(^[^"]*"|"[^"]*$)(*SKIP)(*F)|"/\\"/g'
label="123 \"456\" 789\" \"AB C" e f gh

ここでは、最初から始まる文字列と最後から行末までの"文字列は次のとおりです。"飛び越える残りは次のよう"に置き換えられます。\"

答え2

sed救助に来てください。

sed 's/"/\x1b"/g;s/\x1b"/"/;s/\(.*\)\x1b"/\1"/'

すべての引用符をに置き換えてESC"から、もう一度訪問して最初の引用文を引用文に、最後の引用文を引用文に置き換えます。詳細な説明:

  • s/"/\x1b"/g:すべての引用符文字を\ x1b(ESC)と引用符で置き換えます。

  • s/\x1b"/"/: 最初の \x1b(ESC) と引用符の組み合わせを一重引用符で置き換えます。

  • s/\(.*\)\x1b"/\1"/:最後の\x1b(ESC)と引用符の組み合わせを一重引用符に置き換えます。

出力例:

$ echo label=\"123 \"456\" 789\" \"AB C\" e f gh |sed 's/"/\x1b"/g;s/\x1b"/"/;s/\(.*\)\x1b"/\1"/'|od -c
0000000   l   a   b   e   l   =   "   1   2   3     033   "   4   5   6
0000020 033   "       7   8   9 033   "     033   "   A   B       C   "
0000040       e       f       g   h  \n
0000050
$

答え3

いくつかのステップを経て、要求された内容を取得する方法があります。
変数に文字列を含めることができるとします(文字列に一重引用符はありません)。

$ label='label=\"123 \"456\" 789\" \"AB C\" e f gh'

私たちは後部を切り取ることができます\"

$ front=${label%\\\"*}
$ echo "$front"
\"123 \"456\" 789\" \"AB C

次に最初の項目まで削除します\"

$ mid=${front#*\"}
$ echo "$mid"
123 \"456\" 789\" \"AB C

すべて\"次に変更してください\e"

$ final=${mid//\\\"/\\e}
$ echo "$final"
123 \e456\e 789\e \eAB C

最後に、元の文字列は printf を使用して再構成され、エスケープされます。

$ printf "label=\"${front%%\\\"*}$final\"${label#"${front}"}\n"
label="123 456 789 AB C"" e f gh

$ printf "label=\"${front%%\\\"*}$final\"${label#"${front}"}\n" | od -vAn -t x1c
  6c  61  62  65  6c  3d  22  31  32  33  20  1b  22  34  35  36
   l   a   b   e   l   =   "   1   2   3     033   "   4   5   6
  1b  22  20  37  38  39  1b  22  20  1b  22  41  42  20  43  22
 033   "       7   8   9 033   "     033   "   A   B       C   "
  22  20  65  20  66  20  67  68  0a
   "       e       f       g   h  \n

関連情報