フィルタリングは可能ですか?つまり、内部引用符の前に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